14.7 日期和时间函数
本节描述了用于操作时间值的函数。见第13.2节,“日期和时间数据类型”,了解每种日期和时间类型的取值范围和指定值的有效格式。
表14.11 日期和时间函数
Name | Description |
---|---|
ADDDATE() |
将时间值(间隔)添加到日期值中 |
ADDTIME() |
添加时间 |
CONVERT_TZ() |
将一个时区转换到另一个时区 |
CURDATE() |
返回当前日期 |
CURRENT_DATE() , CURRENT_DATE |
CURDATE()的同义词 |
CURRENT_TIME() , CURRENT_TIME |
CURTIME()的同义词 |
CURRENT_TIMESTAMP() , CURRENT_TIMESTAMP |
NOW()的同义词 |
CURTIME() |
返回当前时间 |
DATE() |
从日期或datetime表达式中提取日期部分 |
DATE_ADD() |
将时间值(间隔)添加到日期值 |
DATE_FORMAT() |
以指定的格式显示日期 |
DATE_SUB() |
从日期值中减去时间值(间隔) |
DATEDIFF() |
将两个日期相减 |
DAY() |
DAYOFMONTH()的同义词 |
DAYNAME() |
返回星期几的名称 |
DAYOFMONTH() |
返回月份中的日期(0-31) |
DAYOFWEEK() |
返回星期几的索引 |
DAYOFYEAR() |
返回年中的日期(1-366) |
EXTRACT() |
提取日期部分 |
FROM_DAYS() |
将天数转换为日期 |
FROM_UNIXTIME() |
将Unix时间戳格式化为日期 |
GET_FORMAT() |
返回日期格式字符串 |
HOUR() |
提取小时 |
LAST_DAY |
返回月份最后一天的日期 |
LOCALTIME() , LOCALTIME |
NOW()的同义词 |
LOCALTIMESTAMP , LOCALTIMESTAMP() |
NOW()的同义词 |
MAKEDATE() |
根据年份和天数创建日期 |
MAKETIME() |
根据小时、分钟、秒创建时间 |
MICROSECOND() |
返回参数中的微秒 |
MINUTE() |
从参数中返回分钟 |
MONTH() |
从日期中返回月份 |
MONTHNAME() |
返回月份名称 |
NOW() |
返回当前日期和时间 |
PERIOD_ADD() |
将年月加到一个期限上 |
PERIOD_DIFF() |
返回两个期限之间的月份数 |
QUARTER() |
从日期参数中返回季度 |
SEC_TO_TIME() |
将秒转换为'hh:mm:ss'格式 |
SECOND() |
返回秒(0-59) |
STR_TO_DATE() |
将字符串转换为日期 |
SUBDATE() |
三参数调用时的 DATE_SUB() 同义词 |
SUBTIME() |
减去时间 |
SYSDATE() |
函数执行时的时间返回 |
TIME() |
表达式中的时间部分提取 |
TIME_FORMAT() |
格式化为时间 |
TIME_TO_SEC() |
将参数转换为秒返回 |
TIMEDIFF() |
减去时间 |
TIMESTAMP() |
单个参数时返回日期或datetime表达式,两个参数时返回参数之和 |
TIMESTAMPADD() |
将 datetime 表达式加上时间间隔 |
TIMESTAMPDIFF() |
返回两个datetime表达式的差异,使用指定的单位 |
TO_DAYS() |
将日期转换为天数 |
TO_SECONDS() |
将日期或datetime转换为自Year 0以来的秒数 |
UNIX_TIMESTAMP() |
返回Unix时间戳 |
UTC_DATE() |
返回当前UTC日期 |
UTC_TIME() |
返回当前UTC时间 |
UTC_TIMESTAMP() |
返回当前UTC日期和时间 |
WEEK() |
返回周数 |
WEEKDAY() |
返回星期几的索引 |
WEEKOFYEAR() |
返回日期的周次(1-53) |
YEAR() |
返回年份 |
YEARWEEK() |
返回年份和周 |
以下是一个使用日期函数的示例。下面的查询选择最后30天内的所有行:
mysql> SELECT something FROM tbl_name
-> WHERE DATE_SUB(CURDATE(),INTERVAL 30 DAY) <= date_col;
该查询也选择未来日期。
期望日期值的函数通常接受datetime值并忽略时间部分,期望时间值的函数通常接受datetime值并忽略日期部分。
返回当前日期或时间的函数每个查询只被评估一次,在查询执行开始时。这意味着一个查询中的多个引用,如NOW()
,总是产生相同结果。 (对我们来说,一个查询也包括存储程序(存储例程、触发器或事件)及其所有子程序的调用。) 这个原则同样适用于CURDATE()
、CURTIME()
、UTC_DATE()
、UTC_TIME()
、UTC_TIMESTAMP()
,以及它们的同义词。
CURRENT_TIMESTAMP()
、CURRENT_TIME()
、CURRENT_DATE()
和FROM_UNIXTIME()
函数返回当前会话时间区的值,这个值可以作为time_zone
系统变量的会话值。另外,UNIX_TIMESTAMP()
假设其参数是当前时间区的datetime值。见第7.1.15节,“MySQL 服务器时间支持”.
一些日期函数可以与“零”日期或不完整日期,如'2001-11-00'
,而其他则不能。提取日期部分的函数通常可以处理不完整日期,从而返回0,而不是你期望的非零值。例如:
mysql> SELECT DAYOFMONTH('2001-11-00'), MONTH('2005-00-00');
-> 0, 0
其他函数则需要完整日期,对不完整日期返回NULL
。这些函数包括执行日期算术或将日期部分映射到名称的函数。例如:
mysql> SELECT DATE_ADD('2006-05-00',INTERVAL 1 DAY);
-> NULL
mysql> SELECT DAYNAME('2006-05-00');
-> NULL
有一些函数在传递DATE()
函数值作为参数时,严格地拒绝不完整的日期,其中日部分为零:CONVERT_TZ()
、DATE_ADD()
、DATE_SUB()
、DAYOFYEAR()
、TIMESTAMPDIFF()
、TO_DAYS()
、TO_SECONDS()
、WEEK()
、WEEKDAY()
、WEEKOFYEAR()
、YEARWEEK()
。
支持TIME
、DATETIME
和TIMESTAMP
值的分秒部分,最高到微秒精度。接受时间参数的函数可以接收带有分秒的小数点值。时间函数的返回值包括适当的小数点秒。
-
ADDDATE(
,日期
,INTERVALexpr
unit
)ADDDATE(
日期
,天数
)当使用第二个参数的INTERVAL形式时,
ADDDATE()
等同于DATE_ADD()
。相关函数SUBDATE()
等同于DATE_SUB()
。关于INTERVALunit
参数的信息,请参见时间间隔。mysql> SELECT DATE_ADD('2008-01-02', INTERVAL 31 DAY); -> '2008-02-02' mysql> SELECT ADDDATE('2008-01-02', INTERVAL 31 DAY); -> '2008-02-02'
当使用第二个参数的天数形式时,MySQL将其视为要添加到
expr
中的整数天数。mysql> SELECT ADDDATE('2008-01-02', 31); -> '2008-02-02'
这个函数如果
日期
或天数
为NULL
,则返回NULL
。 -
ADDTIME()
将expr2
添加到expr1
并返回结果。expr1
是时间或日期表达式,expr2
是时间表达式。如果expr1
或expr2
是NULL
,则返回NULL
。这个函数和
SUBTIME()
函数的返回类型如下确定:-
如果第一个参数是动态参数(例如在预准备语句中),则返回类型为
TIME
。 -
否则,函数的解析类型来自第一个参数的解析类型。
mysql> SELECT ADDTIME('2007-12-31 23:59:59.999999', '1 1:1:1.000002'); -> '2008-01-02 01:01:01.000001' mysql> SELECT ADDTIME('01:00:00.999999', '02:00:00.999998'); -> '03:00:01.999997'
-
-
CONVERT_TZ()
将 datetime 值dt
从由from_tz
指定的时区转换到由to_tz
指定的时区,并返回结果值。时区指定见第7.1.15节,“MySQL 服务器时区支持”。该函数如果任何参数无效或为NULL
,返回NULL
。在32位平台上,这个函数的支持值范围与
TIMESTAMP
类型相同(见第13.2.1节,“日期和时间数据类型语法”,获取范围信息)。在64位平台上,最大支持值为'3001-01-18 23:59:59.999999'
UTC。不管平台或 MySQL 版本,如果值在转换到 UTC 时超出支持范围,无转换发生。
mysql> SELECT CONVERT_TZ('2004-01-01 12:00:00','GMT','MET'); -> '2004-01-01 13:00:00' mysql> SELECT CONVERT_TZ('2004-01-01 12:00:00','+00:00','+10:00'); -> '2004-01-01 22:00:00'
Note要使用命名时区,如
'MET'
或'Europe/Amsterdam'
,必须正确设置时区表。详见第7.1.15节,“MySQL 服务器时区支持”。 -
返回当前日期作为一个值,格式为
'
或YYYY-MM-DD
'YYYYMMDD
,取决于函数在字符串或数字上下文中使用。mysql> SELECT CURDATE(); -> '2008-06-13' mysql> SELECT CURDATE() + 0; -> 20080613
-
CURRENT_DATE
和CURRENT_DATE()
等同于CURDATE()
。 -
CURRENT_TIME
、CURRENT_TIME([
fsp
])CURRENT_TIME
和CURRENT_TIME()
等同于CURTIME()
。 -
CURRENT_TIMESTAMP
、CURRENT_TIMESTAMP([
fsp
])CURRENT_TIMESTAMP
和CURRENT_TIMESTAMP()
是NOW()
的同义词。 -
返回当前时间,以
'hh:mm:ss'
或hhmmss
格式,取决于函数在字符串或数字上下文中。该值以会话时区表示。如果指定了
fsp
参数,以指定小数秒精度从 0 到 6,小数秒部分将包含该多个数字。mysql> SELECT CURTIME(); +-----------+ | CURTIME() | +-----------+ | 19:25:37 | +-----------+ mysql> SELECT CURTIME() + 0; +---------------+ | CURTIME() + 0 | +---------------+ | 192537 | +---------------+ mysql> SELECT CURTIME(3); +--------------+ | CURTIME(3) | +--------------+ | 19:25:37.840 | +--------------+
-
从日期或日期时间表达式
expr
中提取日期部分。如果expr
是NULL
,则返回NULL
。mysql> SELECT DATE('2003-12-31 01:02:03'); -> '2003-12-31'
-
DATEDIFF()
返回从一个日期到另一个日期的天数差异,expr1
和expr2
是日期或日期时间表达式,只使用日期部分进行计算。mysql> SELECT DATEDIFF('2007-12-31 23:59:59','2007-12-30'); -> 1 mysql> SELECT DATEDIFF('2010-11-30 23:59:59','2010-12-31'); -> -31
如果
expr1
或expr2
是NULL
,则该函数返回NULL
。 -
DATE_ADD(
、date
,INTERVALexpr
unit
)DATE_SUB(
date
,INTERVALexpr
unit
)这些函数执行日期算术。
date
参数指定开始日期或datetime值。expr
是一个指定要添加或减去的间隔值表达式,expr
将被评估为字符串,可以以-
开头表示负间隔。unit
是一个关键字,指示表达式应该如何解释。关于时间间隔语法的更多信息,包括完整的
unit
指定符列表、每个unit
值对应的expr
参数形式和时间间隔算术运算中的操作数解释,见时间间隔。返回值取决于参数:
为了确保结果是
DATETIME
,可以使用CAST()
将第一个参数转换为DATETIME
。mysql> SELECT DATE_ADD('2018-05-01',INTERVAL 1 DAY); -> '2018-05-02' mysql> SELECT DATE_SUB('2018-05-01',INTERVAL 1 YEAR); -> '2017-05-01' mysql> SELECT DATE_ADD('2020-12-31 23:59:59', -> INTERVAL 1 SECOND); -> '2021-01-01 00:00:00' mysql> SELECT DATE_ADD('2018-12-31 23:59:59', -> INTERVAL 1 DAY); -> '2019-01-01 23:59:59' mysql> SELECT DATE_ADD('2100-12-31 23:59:59', -> INTERVAL '1:1' MINUTE_SECOND); -> '2101-01-01 00:01:00' mysql> SELECT DATE_SUB('2025-01-01 00:00:00', -> INTERVAL '1 1:1:1' DAY_SECOND); -> '2024-12-30 22:58:59' mysql> SELECT DATE_ADD('1900-01-01 00:00:00', -> INTERVAL '-1 10' DAY_HOUR); -> '1899-12-30 14:00:00' mysql> SELECT DATE_SUB('1998-01-02', INTERVAL 31 DAY); -> '1997-12-02' mysql> SELECT DATE_ADD('1992-12-31 23:59:59.000002', -> INTERVAL '1.999999' SECOND_MICROSECOND); -> '1993-01-01 00:00:01.000001'
在将
MONTH
间隔添加到DATE
或DATETIME
值时,如果结果日期包含不在给定月份中的天数,天数将被调整到该月的最后一天,如下所示:mysql> SELECT DATE_ADD('2024-03-30', INTERVAL 1 MONTH) AS d1, > DATE_ADD('2024-03-31', INTERVAL 1 MONTH) AS d2; +------------+------------+ | d1 | d2 | +------------+------------+ | 2024-04-30 | 2024-04-30 | +------------+------------+ 1 row in set (0.00 sec)
-
根据
format
字符串格式化date
值。如果两个参数都为NULL
,函数返回NULL
。以下表格中的指定符可以在
format
字符串中使用。%字符是必需的,格式指定符字符前缀。这些指定符也适用于其他函数:STR_TO_DATE()
、TIME_FORMAT()
、UNIX_TIMESTAMP()
。Specifier Description %a
简写星期名( Sun
..Sat
)%b
简写月份名( Jan
..Dec
)%c
数字月份( 0
..12
)%D
带英语后缀的日期( 0th
,1st
,2nd
,3rd
, …)%d
数字日期( 00
..31
)%e
数字日期( 0
..31
)%f
微秒( 000000
..999999
)%H
小时( 00
..23
)%h
小时( 01
..12
)%I
小时( 01
..12
)%i
分钟,数字( 00
..59
)%j
年内日期( 001
..366
)%k
小时( 0
..23
)%l
小时( 1
..12
)%M
月份名称( January
..December
)%m
月份,数字( 00
..12
)%p
AM 或 PM %r
时间,12小时( hh:mm:ss
,后跟 AM 或 PM)%S
秒数( 00
..59
)%s
秒数( 00
..59
)%T
时间,24小时( hh:mm:ss
%U
周( 00
..53
),其中星期天是第一天;WEEK()
模式 0%u
周( 00
..53
),其中星期一是第一天;WEEK()
模式 1%V
星期( 01
..53
),星期日为一周的第一天;WEEK()
模式 2;用于%X
%v
星期( 01
..53
),星期一为一周的第一天;WEEK()
模式 3;用于%x
%W
星期几名( 星期日
..星期六
)%w
一周中的某天( 0
=星期日..6
=星期六)%X
星期的年份,数字,四位;用于 %V
%x
星期的年份,数字,四位;用于 %v
%Y
年份,数字,四位 年份,数字(两位) %%
%%
一个字面 %
字符%
x
x
,用于上面不列出的任何 “x
”月份和日期指定的范围从零开始,因为 MySQL 允许存储不完整的日期,如
'2014-00-00'
。控制日、月名称和缩写的语言由系统变量
lc_time_names
的值控制(第12.16节,“MySQL 服务器 locale 支持”)。对于
%U
、%u
、%V
和%v
指定符,请查看WEEK()
函数的描述,了解模式值对周号命名的影响。DATE_FORMAT()
返回一个字符集和排序规则由character_set_connection
和collation_connection
给定的字符串,以便返回包含非 ASCII 字符的月份和星期名称。mysql> SELECT DATE_FORMAT('2009-10-04 22:23:00', '%W %M %Y'); -> 'Sunday October 2009' mysql> SELECT DATE_FORMAT('2007-10-04 22:23:00', '%H:%i:%s'); -> '22:23:00' mysql> SELECT DATE_FORMAT('1900-10-04 22:23:00', -> '%D %y %a %d %m %b %j'); -> '4th 00 Thu 04 10 Oct 277' mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00', -> '%H %k %I %r %T %S %w'); -> '22 22 10 10:23:00 PM 22:23:00 00 6' mysql> SELECT DATE_FORMAT('1999-01-01', '%X %V'); -> '1998 52' mysql> SELECT DATE_FORMAT('2006-06-00', '%d'); -> '00'
-
DATE_SUB(
date
,INTERVALexpr
unit
)查看
DATE_ADD()
的描述。 -
DAY()
是DAYOFMONTH()
的同义词。 -
返回
date
的星期几名称。语言由系统变量lc_time_names
控制(见第12.16节,“MySQL 服务器 locale 支持”)。如果date
是NULL
,则返回NULL
。mysql> SELECT DAYNAME('2007-02-03'); -> 'Saturday'
-
返回
date
的月份,范围为1
到31
,或对日期如'0000-00-00'
或'2008-00-00'
的零天部分返回0
。如果date
是NULL
,则返回NULL
。mysql> SELECT DAYOFMONTH('2007-02-03'); -> 3
-
返回
date
的星期几索引(1
= 星期天,2
= 星期一,…,7
= 星期六)。如果date
是NULL
,则返回NULL
。mysql> SELECT DAYOFWEEK('2007-02-03'); -> 7
-
返回
date
的年内日索引,范围为1
到366
。如果date
是NULL
,则返回NULL
.mysql> SELECT DAYOFYEAR('2007-02-03'); -> 34
-
函数
EXTRACT()
使用与DATE_ADD()
或DATE_SUB()
相同的unit
指定符,但从日期中提取部分,而不是执行日期运算。关于unit
参数,请参阅时间间隔。如果date
是NULL
,则返回NULL
.mysql> SELECT EXTRACT(YEAR FROM '2019-07-02'); -> 2019 mysql> SELECT EXTRACT(YEAR_MONTH FROM '2019-07-02 01:02:03'); -> 201907 mysql> SELECT EXTRACT(DAY_MINUTE FROM '2019-07-02 01:02:03'); -> 20102 mysql> SELECT EXTRACT(MICROSECOND -> FROM '2003-01-02 10:30:00.000123'); -> 123
-
给定一个日数
N
,返回一个DATE
值。如果N
是NULL
,则返回NULL
。mysql> SELECT FROM_DAYS(730669); -> '2000-07-03'
使用
FROM_DAYS()
时要小心。它不适用于前于格里高兰历的日期(1582年)。请参阅Section 13.2.7
。 -
FROM_UNIXTIME(
unix_timestamp
[,format
])返回一个表示
unix_timestamp
的日期或字符字符串值。返回的值使用会话时区表达(客户端可以按照Section 7.1.15
中描述设置会话时区)。unix_timestamp
是一个内部时间戳值,表示自 UTC‘1970-01-01 00:00:00’以来的秒数,如UNIX_TIMESTAMP()
函数生产的。如果省略了
format
,该函数返回一个DATETIME
值。如果
unix_timestamp
或format
为NULL
,该函数返回NULL
。如果
unix_timestamp
是整数,那么DATETIME
的小数秒精度为零。若unix_timestamp
是一个十进制值,那么DATETIME
的小数秒精度与该值相同,至多6位。若unix_timestamp
是一个浮点数,那么datetime
的小数秒精度为6位。在32位平台上,
unix_timestamp
的最大有用值是2147483647.999999,返回UTC时间‘2038-01-19 03:14:07.999999’。在64位平台上,有效的最大值为32536771199.999999,返回UTC时间‘3001-01-18 23:59:59.999999’。无论平台还是版本,unix_timestamp
的值大于有效最大值都将返回0
。format
用于将结果格式化,类似于DATE_FORMAT()
函数中的格式字符串。如果提供了format
,返回的值是一个VARCHAR
。mysql> SELECT FROM_UNIXTIME(1447430881); -> '2015-11-13 10:08:01' mysql> SELECT FROM_UNIXTIME(1447430881) + 0; -> 20151113100801 mysql> SELECT FROM_UNIXTIME(1447430881, -> '%Y %D %M %h:%i:%s %x'); -> '2015 13th November 10:08:01 2015'
Note如果使用
UNIX_TIMESTAMP()
和FROM_UNIXTIME()
将非 UTC 时间区间值转换为 Unix 时间戳值,转换是有损失的,因为双向映射不是一对一的。详见UNIX_TIMESTAMP()
函数的描述。 -
GET_FORMAT({DATE|TIME|DATETIME}, {'EUR'|'USA'|'JIS'|'ISO'|'INTERNAL'})
返回一个格式字符串。这一函数在与
DATE_FORMAT()
和STR_TO_DATE()
函数结合时非常有用。如果
format
是NULL
,这个函数返回NULL
。第一个和第二个参数的可能值导致了多种格式字符串(用于指定的,见
DATE_FORMAT()
函数描述)。ISO 格式指的是 ISO 9075,不是 ISO 8601。Function Call Result GET_FORMAT(DATE,'USA')
'%m.%d.%Y'
GET_FORMAT(DATE,'JIS')
'%Y-%m-%d'
GET_FORMAT(DATE,'ISO')
'%Y-%m-%d'
GET_FORMAT(DATE,'EUR')
'%d.%m.%Y'
GET_FORMAT(DATE,'INTERNAL')
'%Y%m%d'
GET_FORMAT(DATETIME,'USA')
'%Y-%m-%d %H.%i.%s'
GET_FORMAT(DATETIME,'JIS')
'%Y-%m-%d %H:%i:%s'
GET_FORMAT(DATETIME,'ISO')
'%Y-%m-%d %H:%i:%s'
GET_FORMAT(DATETIME,'EUR')
'%Y-%m-%d %H.%i.%s'
GET_FORMAT(DATETIME,'INTERNAL')
'%Y%m%d%H%i%s'
GET_FORMAT(TIME,'USA')
'%h:%i:%s %p'
GET_FORMAT(TIME,'JIS')
'%H:%i:%s'
GET_FORMAT(TIME,'ISO')
'%H:%i:%s'
GET_FORMAT(TIME,'EUR')
'%H.%i.%s'
GET_FORMAT(TIME,'INTERNAL')
'%H%i%s'
TIMESTAMP
也可以作为GET_FORMAT()
的第一个参数,在这种情况下,函数返回与DATETIME
相同的值。mysql> SELECT DATE_FORMAT('2003-10-03',GET_FORMAT(DATE,'EUR')); -> '03.10.2003' mysql> SELECT STR_TO_DATE('10.31.2003',GET_FORMAT(DATE,'USA')); -> '2003-10-31'
-
HOUR(<em class="replaceable"><code>time</code></em>)
返回 <code>time</code> 的小时。返回值的范围是
0
到23
,但实际上TIME
值的范围更大,所以HOUR
可以返回值大于23
。如果 <code>time</code> 是NULL
,则返回NULL
。mysql> SELECT HOUR('10:05:03'); -> 10 mysql> SELECT HOUR('272:59:59'); -> 272
-
LAST_DAY(<em class="replaceable"><code>date</code></em>)
对日期或 datetime 值进行处理,返回月份最后一天的值。如果参数无效或是
NULL
,则返回NULL
。mysql> SELECT LAST_DAY('2003-02-05'); -> '2003-02-28' mysql> SELECT LAST_DAY('2004-02-05'); -> '2004-02-29' mysql> SELECT LAST_DAY('2004-01-01 01:01:01'); -> '2004-01-31' mysql> SELECT LAST_DAY('2003-03-32'); -> NULL
-
LOCALTIME
,LOCALTIME([<em class="replaceable"><code>fsp</code></em>])
LOCALTIME
和LOCALTIME()
等同于NOW()
。 -
LOCALTIMESTAMP
,LOCALTIMESTAMP([
fsp
]) -
返回给定年和日历天值的日期。
dayofyear
必须大于0,否则结果为NULL
。结果也为NULL
如果任意一个参数为NULL
.mysql> SELECT MAKEDATE(2011,31), MAKEDATE(2011,32); -> '2011-01-31', '2011-02-01' mysql> SELECT MAKEDATE(2011,365), MAKEDATE(2014,365); -> '2011-12-31', '2014-12-31' mysql> SELECT MAKEDATE(2011,0); -> NULL
-
返回从
hour
、minute
和second
参数计算的时间值。如果任意一个参数为NULL
,返回NULL
.秒钟部分可以是小数。
mysql> SELECT MAKETIME(12,15,30); -> '12:15:30'
-
MICROSECOND(<em class="replaceable"><code>expr</code></em>)
返回时间或日期表达式<em class="replaceable"><code>expr</code></em>中的微秒数,范围从<code class="literal">0</code>到<code class="literal">999999</code>。如果<em class="replaceable"><code>expr</code></em>为<code class="literal">NULL</code>,则返回<code class="literal">NULL</code>。
mysql> SELECT MICROSECOND('12:00:00.123456'); -> 123456 mysql> SELECT MICROSECOND('2019-12-31 23:59:59.000010'); -> 10
-
MINUTE(<em class="replaceable"><code>time</code></em>)
返回<em class="replaceable"><code>time</code></em>中的分钟数,范围从<code class="literal">0</code>到<code class="literal">59</code>,如果<em class="replaceable"><code>time</code></em>为<code class="literal">NULL</code>,则返回<code class="literal">NULL</code>。
mysql> SELECT MINUTE('2008-02-03 10:05:03'); -> 5
-
MONTH(<em class="replaceable"><code>date</code></em>)
返回<em class="replaceable"><code>date</code></em>中的月份数,范围从<code class="literal">1</code>到<code class="literal">12</code>,对应于一月到十二月,或者返回<code class="literal">0</code>对于日期如<code class="literal">'0000-00-00'</code>或<code class="literal">'2008-00-00'</code>,这些日期的月份部分为零。 如果<em class="replaceable"><code>date</code></em>为<code class="literal">NULL</code>,则返回<code class="literal">NULL</code>。
mysql> SELECT MONTH('2008-02-03'); -> 2
-
MONTHNAME(<em class="replaceable"><code>date</code></em>)
返回日期的全名,对应于
date
。语言控制由lc_time_names
系统变量(第12.16节,“MySQL 服务器 locale 支持”)。如果date
为NULL
,返回NULL
。mysql> SELECT MONTHNAME('2008-02-03'); -> 'February'
-
以字符串或数字上下文返回当前日期和时间,格式为'
YYYY-MM-DD hh:mm:ss
'或YYYYMMDDhhmmss
,取决于函数的使用上下文。该值以会话时区表示。如果给定
fsp
参数指定小数秒精度从0到6,返回值包括小数秒部分的该多个数字。mysql> SELECT NOW(); -> '2007-12-15 23:50:26' mysql> SELECT NOW() + 0; -> 20071215235026.000000
NOW()
返回语句开始执行时的常量时间。在存储函数或触发器中,NOW()
返回函数或触发语句开始执行时的时间。这与SYSDATE()
不同,后者返回执行时的确切时间。mysql> SELECT NOW(), SLEEP(2), NOW(); +---------------------+----------+---------------------+ | NOW() | SLEEP(2) | NOW() | +---------------------+----------+---------------------+ | 2006-04-12 13:47:36 | 0 | 2006-04-12 13:47:36 | +---------------------+----------+---------------------+ mysql> SELECT SYSDATE(), SLEEP(2), SYSDATE(); +---------------------+----------+---------------------+ | SYSDATE() | SLEEP(2) | SYSDATE() | +---------------------+----------+---------------------+ | 2006-04-12 13:47:44 | 0 | 2006-04-12 13:47:46 | +---------------------+----------+---------------------+
此外,
SET TIMESTAMP
语句影响了NOW()
的返回值,但不影响SYSDATE()
的返回值。这意味着二进制日志中的时间戳设置对SYSDATE()
的调用没有影响。将时间戳设置为非零值,使每次后续的NOW()
调用返回该值。将时间戳设置为零取消这个效果,使NOW()
再次返回当前日期和时间。查看
SYSDATE()
的描述,以了解这两个函数之间的差异。 -
将期限
P
(以格式YYMM
或YYYYMM
表示) 加N
个月,返回值以格式YYYYMM
表示。Note期限参数
P
不是日期值。如果
P
或N
是NULL
,则该函数返回NULL
。mysql> SELECT PERIOD_ADD(200801,2); -> 200803
-
返回两个时间段
P1
和P2
之间的月数。注意,期限参数P1
和P2
不是日期值。如果
P1
或P2
是NULL
,则该函数返回NULL
。mysql> SELECT PERIOD_DIFF(200802,200703); -> 11
-
返回
date
的年份季度,范围为1
到4
,或如果date
是NULL
则返回NULL
。mysql> SELECT QUARTER('2008-04-01'); -> 2
-
返回第二个
time
,范围为0
到59
,或如果time
是NULL
则返回NULL
。mysql> SELECT SECOND('10:05:03'); -> 3
-
将
seconds
转换为小时、分钟和秒,作为一个TIME
值。结果的范围受TIME
数据类型的约束。如果参数对应的值超出该范围,出现警告。如果
seconds
是NULL
则返回NULL
。mysql> SELECT SEC_TO_TIME(2378); -> '00:39:38' mysql> SELECT SEC_TO_TIME(2378) + 0; -> 3938
-
这是
DATE_FORMAT()
函数的逆向操作。它将字符串str
和格式字符串format
作为参数。STR_TO_DATE()
如果格式字符串包含日期和时间部分,返回DATETIME
值;如果字符串只包含日期或时间部分,返回DATE
或TIME
值。如果str
或format
为NULL
,函数返回NULL
。如果服务器根据规则无法解析从str
中提取的日期、时间或datetime值,STR_TO_DATE()
返回NULL
并产生警告。服务器尝试将
str
与format
匹配。格式字符串可以包含字面字符和以%
开头的格式指定符。在format
中的字面字符必须在str
中完全匹配。格式指定符在format
中必须与str
中的日期或时间部分匹配。用于format
的指定符,请参阅DATE_FORMAT()
函数描述。mysql> SELECT STR_TO_DATE('01,5,2013','%d,%m,%Y'); -> '2013-05-01' mysql> SELECT STR_TO_DATE('May 1, 2013','%M %d,%Y'); -> '2013-05-01'
扫描从
str
的开始,如果找不到匹配的format
则失败。末尾的额外字符被忽略。mysql> SELECT STR_TO_DATE('a09:30:17','a%h:%i:%s'); -> '09:30:17' mysql> SELECT STR_TO_DATE('a09:30:17','%h:%i:%s'); -> NULL mysql> SELECT STR_TO_DATE('09:30:17a','%h:%i:%s'); -> '09:30:17'
未指定的日期或时间部分的值为 0,因此
str
中不完全指定的值将产生结果,其中一些或所有部分设置为 0:mysql> SELECT STR_TO_DATE('abc','abc'); -> '0000-00-00' mysql> SELECT STR_TO_DATE('9','%m'); -> '0000-09-00' mysql> SELECT STR_TO_DATE('9','%s'); -> '00:00:09'
日期值的范围检查如第13.2.2节,“DATE、DATETIME 和 TIMESTAMP 类型”所描述。例如,零日期或部分值为 0 的日期允许,除非 SQL 模式设置禁止这样的值。
mysql> SELECT STR_TO_DATE('00/00/0000', '%m/%d/%Y'); -> '0000-00-00' mysql> SELECT STR_TO_DATE('04/31/2004', '%m/%d/%Y'); -> '2004-04-31'
如果启用了
NO_ZERO_DATE
SQL 模式,零日期将被禁止。在这种情况下,STR_TO_DATE()
返回NULL
并生成警告:mysql> SET sql_mode = ''; mysql> SELECT STR_TO_DATE('00/00/0000', '%m/%d/%Y'); +---------------------------------------+ | STR_TO_DATE('00/00/0000', '%m/%d/%Y') | +---------------------------------------+ | 0000-00-00 | +---------------------------------------+ mysql> SET sql_mode = 'NO_ZERO_DATE'; mysql> SELECT STR_TO_DATE('00/00/0000', '%m/%d/%Y'); +---------------------------------------+ | STR_TO_DATE('00/00/0000', '%m/%d/%Y') | +---------------------------------------+ | NULL | +---------------------------------------+ mysql> SHOW WARNINGS\G *************************** 1. row *************************** Level: Warning Code: 1411 Message: Incorrect datetime value: '00/00/0000' for function str_to_date
在 MySQL 的一些前版本中,可以将无效日期字符串,如
'2021-11-31'
传递给这个函数。在 MySQL 8.4 中,STR_TO_DATE()
完全执行范围检查,如果转换后的日期无效,则抛出错误。Note您不能使用格式
"%X%V"
将年周字符串转换为日期,因为年和周的组合在月边界上不唯一地标识一个年和月。如果要将年周转换为日期,应该还指定星期日:mysql> SELECT STR_TO_DATE('200442 Monday', '%X%V %W'); -> '2004-10-18'
您也应该注意,日期和datetime值的日期部分,
STR_TO_DATE()
只检查单个年、月、日的有效性。更精确地说,这意味着年份被检查以确保在范围0-9999之间,月份被检查以确保在范围1-12之间,日份被检查以确保在范围1-31之间,但服务器不检查这些值的组合。例如,SELECT STR_TO_DATE('23-2-31', '%Y-%m-%d')
返回2023-02-31
。启用或禁用ALLOW_INVALID_DATES
服务器 SQL 模式对这个行为没有影响。见第13.2.2节,“DATE、DATETIME 和 TIMESTAMP 类型”,了解更多信息。 -
SUBDATE(
,date
,INTERVALexpr
unit
)SUBDATE(
expr
,days
)使用第二个参数的
INTERVAL
形式时,SUBDATE()
等同于DATE_SUB()
。关于INTERVAL
unit
参数的信息,请参阅DATE_ADD()
的讨论。mysql> SELECT DATE_SUB('2008-01-02', INTERVAL 31 DAY); -> '2007-12-02' mysql> SELECT SUBDATE('2008-01-02', INTERVAL 31 DAY); -> '2007-12-02'
第二种形式使得可以使用整数值来指定
days
。在这种情况下,它将被解释为从日期或datetime表达式expr
中减去的天数。mysql> SELECT SUBDATE('2008-01-02 12:00:00', 31); -> '2007-12-02 12:00:00'
如果该函数的任意一个参数是
NULL
,则该函数返回NULL
。 -
SUBTIME()
将返回expr1
−expr2
,以expr1
的相同格式表示。其中,expr1
是时间或datetime表达式,expr2
是时间表达式。该函数的返回类型解析方式与
ADDTIME()
函数相同;请参阅该函数的描述以获取更多信息。mysql> SELECT SUBTIME('2007-12-31 23:59:59.999999','1 1:1:1.000002'); -> '2007-12-30 22:58:58.999997' mysql> SELECT SUBTIME('01:00:00.999999', '02:00:00.999998'); -> '-00:59:59.999999'
如果
expr1
或expr2
为NULL
,则该函数返回NULL
。 -
以字符串或数字上下文返回当前日期和时间,格式为'
YYYY-MM-DD hh:mm:ss
'或YYYYMMDDhhmmss
。如果指定了
fsp
参数,用于指定小数点精度从0到6位,小数点部分的长度为该位数。SYSDATE()
返回执行时刻,而NOW()
返回语句开始执行的时间。在存储函数或触发器中,NOW()
返回函数或触发语句开始执行的时间。mysql> SELECT NOW(), SLEEP(2), NOW(); +---------------------+----------+---------------------+ | NOW() | SLEEP(2) | NOW() | +---------------------+----------+---------------------+ | 2006-04-12 13:47:36 | 0 | 2006-04-12 13:47:36 | +---------------------+----------+---------------------+ mysql> SELECT SYSDATE(), SLEEP(2), SYSDATE(); +---------------------+----------+---------------------+ | SYSDATE() | SLEEP(2) | SYSDATE() | +---------------------+----------+---------------------+ | 2006-04-12 13:47:44 | 0 | 2006-04-12 13:47:46 | +---------------------+----------+---------------------+
此外,
SET TIMESTAMP
语句影响NOW()
的返回值,但不影响SYSDATE()
的返回值。这意味着二进制日志中的时间戳设置对SYSDATE()
的调用没有影响。因为
SYSDATE()
可以在同一语句中返回不同的值,并且不受SET TIMESTAMP
的影响,所以它是非确定性的,故而在使用语句基于的二进制日志时不可靠。如果这是一個问题,你可以使用行基于的日志。或者,你可以使用
--sysdate-is-now
选项,导致SYSDATE()
成为NOW()
的别名。这在源服务器和副本服务器都使用该选项时有效。SYSDATE()
的非确定性也意味着不能对包含它的表达式使用索引。 -
从时间或日期表达式
expr
中提取时间部分,并将其返回为字符串。如果expr
是NULL
,则返回NULL
。这个函数在语句级别复制中不安全。如果你使用这个函数,而
binlog_format
设置为STATEMENT
,将会记录警告。mysql> SELECT TIME('2003-12-31 01:02:03'); -> '01:02:03' mysql> SELECT TIME('2003-12-31 01:02:03.000123'); -> '01:02:03.000123'
-
TIMEDIFF()
将返回expr1
−expr2
,以时间值形式表示。expr1
和expr2
是字符串,将被转换为TIME
或DATETIME
表达式;这些必须在转换后具有相同的类型。如果expr1
或expr2
是NULL
,则返回NULL
。TIMEDIFF() 函数返回的结果受
TIME
值允许的范围限制。也可以使用函数TIMESTAMPDIFF()
和UNIX_TIMESTAMP()
,这两个函数都返回整数。mysql> SELECT TIMEDIFF('2000-01-01 00:00:00', -> '2000-01-01 00:00:00.000001'); -> '-00:00:00.000001' mysql> SELECT TIMEDIFF('2008-12-31 23:59:59.000001', -> '2008-12-30 01:01:01.000002'); -> '46:58:57.999999'
-
TIMESTAMP(
,expr
)TIMESTAMP(
expr1
,expr2
)单个参数时,该函数将日期或日期时间表达式
expr
转换为datetime值。两个参数时,它将日期或日期时间表达式expr1
和时间表达式expr2
相加,并返回结果为datetime值。如果expr
,expr1
, 或expr2
是NULL
,则返回NULL
。mysql> SELECT TIMESTAMP('2003-12-31'); -> '2003-12-31 00:00:00' mysql> SELECT TIMESTAMP('2003-12-31 12:00:00','12:00:00'); -> '2004-01-01 00:00:00'
-
TIMESTAMPADD(
unit
,interval
,datetime_expr
)将整数表达式
interval
添加到日期或日期时间表达式datetime_expr
中。interval
的单位由unit
参数指定,应该是以下值之一:MICROSECOND
(微秒)、SECOND
、MINUTE
、HOUR
、DAY
、WEEK
、MONTH
、QUARTER
或YEAR
。可以使用关键字指定
unit
值,或者使用前缀SQL_TSI_
。例如,DAY
和SQL_TSI_DAY
都是合法的。如果
interval
或datetime_expr
是NULL
,则该函数返回NULL
。mysql> SELECT TIMESTAMPADD(MINUTE, 1, '2003-01-02'); -> '2003-01-02 00:01:00' mysql> SELECT TIMESTAMPADD(WEEK,1,'2003-01-02'); -> '2003-01-09'
将
MONTH
间隔添加到DATE
或DATETIME
值中,如果结果日期包含不在给定月份的日子,会调整到该月最后一天,如下所示:mysql> SELECT TIMESTAMPADD(MONTH, 1, DATE '2024-03-30') AS t1, > TIMESTAMPADD(MONTH, 1, DATE '2024-03-31') AS t2; +------------+------------+ | t1 | t2 | +------------+------------+ | 2024-04-30 | 2024-04-30 | +------------+------------+ 1 row in set (0.00 sec)
-
TIMESTAMPDIFF(
unit
,datetime_expr1
,datetime_expr2
)返回
datetime_expr2
−datetime_expr1
,其中datetime_expr1
和datetime_expr2
是日期或日期时间表达式。一个表达式可能是日期,另一个是日期时间;日期值将被视为具有'00:00:00'
的日期时间,其中必要时。结果的单位由unit
参数给出。unit
的合法值与TIMESTAMPADD()
函数的描述中列举的一样。如果
datetime_expr1
或datetime_expr2
是NULL
,则该函数返回NULL
。mysql> SELECT TIMESTAMPDIFF(MONTH,'2003-02-01','2003-05-01'); -> 3 mysql> SELECT TIMESTAMPDIFF(YEAR,'2002-05-01','2001-01-01'); -> -1 mysql> SELECT TIMESTAMPDIFF(MINUTE,'2003-02-01','2003-05-01 12:05:55'); -> 128885
Note这个函数的日期或日期时间参数顺序与使用
TIMESTAMP()
函数时的顺序相反,用于两个参数的情况。 -
这个函数类似于
DATE_FORMAT()
函数,但是format
字符串只能包含小时、分钟、秒和微秒的格式符号。其他符号将返回NULL
或0
TIME_FORMAT()
如果time
或format
为NULL
将返回NULL
.如果
time
值包含大于23
的小时部分,%H
和%k
小时格式符号将产生一个大于通常范围0..23
的值。其他小时格式符号将产生小时值的模12。mysql> SELECT TIME_FORMAT('100:00:00', '%H %k %h %I %l'); -> '100 100 04 04 4'
-
将
time
转换为秒,返回NULL
如果time
为NULL
.mysql> SELECT TIME_TO_SEC('22:23:00'); -> 80580 mysql> SELECT TIME_TO_SEC('00:39:38'); -> 2378
-
给定日期
date
,返回一个天数(从年0开始的天数)。返回NULL
如果date
为NULL
.mysql> SELECT TO_DAYS(950501); -> 728779 mysql> SELECT TO_DAYS('2007-10-07'); -> 733321
TO_DAYS()
不适用于前于公历曆日(1582)之前的日期,因为它不考虑曆法变更时所失去的天数。对于1582年以前(或其他地区可能晚于1582年的日期),该函数结果不可靠。请参阅第13.2.7节,“MySQL 使用哪种曆法?”,了解详细信息。请记住,MySQL 将二位年份值在日期中转换为四位形式,遵循第13.2节,“日期和时间数据类型”中的规则。例如,
'2008-10-07'
和'08-10-07'
被视为相同的日期:mysql> SELECT TO_DAYS('2008-10-07'), TO_DAYS('08-10-07'); -> 733687, 733687
在 MySQL 中,零日期定义为
'0000-00-00'
,即使该日期本身被认为无效。这意味着,对于'0000-00-00'
和'0000-01-01'
,TO_DAYS()
返回以下值:mysql> SELECT TO_DAYS('0000-00-00'); +-----------------------+ | to_days('0000-00-00') | +-----------------------+ | NULL | +-----------------------+ 1 row in set, 1 warning (0.00 sec) mysql> SHOW WARNINGS; +---------+------+----------------------------------------+ | Level | Code | Message | +---------+------+----------------------------------------+ | Warning | 1292 | Incorrect datetime value: '0000-00-00' | +---------+------+----------------------------------------+ 1 row in set (0.00 sec) mysql> SELECT TO_DAYS('0000-01-01'); +-----------------------+ | to_days('0000-01-01') | +-----------------------+ | 1 | +-----------------------+ 1 row in set (0.00 sec)
无论是否启用
ALLOW_INVALID_DATES
SQL 服务器模式。 -
给定一个日期或datetime
expr
,返回自公元元年以来秒数。如果expr
不是有效的日期或datetime值(包括NULL
),则返回NULL
。mysql> SELECT TO_SECONDS(950501); -> 62966505600 mysql> SELECT TO_SECONDS('2009-11-29'); -> 63426672000 mysql> SELECT TO_SECONDS('2009-11-29 13:43:32'); -> 63426721412 mysql> SELECT TO_SECONDS( NOW() ); -> 63426721458
像
TO_DAYS()
一样,TO_SECONDS()
不适用于前于公历曆(1582)之前的日期,因为它不考虑曆法变更时丢失的天数。对于在1582年(或其他地区可能晚于该年)前的日期,函数结果不可靠。请参阅第13.2.7节,“MySQL 使用哪种日历?”,了解详细信息。像
TO_DAYS()
一样,TO_SECONDS()
将二位年值日期转换为四位年值日期,使用第13.2节,“日期和时间数据类型”中规定的规则。在 MySQL 中,零日期定义为
'0000-00-00'
,即使这个日期本身被认为无效。这意味着,对于'0000-00-00'
和'0000-01-01'
,TO_SECONDS()
返回以下值:mysql> SELECT TO_SECONDS('0000-00-00'); +--------------------------+ | TO_SECONDS('0000-00-00') | +--------------------------+ | NULL | +--------------------------+ 1 row in set, 1 warning (0.00 sec) mysql> SHOW WARNINGS; +---------+------+----------------------------------------+ | Level | Code | Message | +---------+------+----------------------------------------+ | Warning | 1292 | Incorrect datetime value: '0000-00-00' | +---------+------+----------------------------------------+ 1 row in set (0.00 sec) mysql> SELECT TO_SECONDS('0000-01-01'); +--------------------------+ | TO_SECONDS('0000-01-01') | +--------------------------+ | 86400 | +--------------------------+ 1 row in set (0.00 sec)
这是否启用了
ALLOW_INVALID_DATES
SQL 服务器模式都一样。 -
如果没有提供
日期
参数,UNIX_TIMESTAMP()
返回自 1970-01-01 00:00:00 UTC 以来秒数。如果提供了
日期
参数,UNIX_TIMESTAMP()
返回该参数的值,以 1970-01-01 00:00:00 UTC 为基准。服务器将日期
解释为会话时区中的值,并将其转换为内部 Unix 时间戳值在 UTC 中。 (客户端可以按照第7.1.15节,“MySQL 服务器时区支持”中描述设置会话时区。)日期
参数可以是DATE
、DATETIME
、TIMESTAMP
字符串,或者是YYMMDD
、YYMMDDhhmmss
、YYYYMMDD
或YYYYMMDDhhmmss
格式。如果参数包含时间部分,可以选itionally 包含小数秒部分。如果不提供参数或参数不包含小数部分,返回值是一个整数;否则,如果参数包含小数部分,返回值是一个
DECIMAL
类型的值。当
date
参数是TIMESTAMP
列时,UNIX_TIMESTAMP()
直接返回内部时间戳值,不进行隐式“字符串到Unix时间戳”转换。参数的有效范围与
TIMESTAMP
数据类型相同:'1970-01-01 00:00:01.000000'
UTC 到'2038-01-19 03:14:07.999999'
UTC(32位平台);对于64位平台,参数的有效范围是'1970-01-01 00:00:01.000000'
UTC 到'3001-01-19 03:14:07.999999'
UTC(对应32536771199.999999秒)。无论MySQL版本或平台架构,如果将日期传递给
UNIX_TIMESTAMP()
,它返回0
。如果date
是NULL
NULL
。mysql> SELECT UNIX_TIMESTAMP(); -> 1447431666 mysql> SELECT UNIX_TIMESTAMP('2015-11-13 10:20:19'); -> 1447431619 mysql> SELECT UNIX_TIMESTAMP('2015-11-13 10:20:19.012'); -> 1447431619.012
如果您使用
UNIX_TIMESTAMP()
和FROM_UNIXTIME()
将非UTC时间区的值转换为Unix时间戳值,转换是有损失的,因为这两个方向的映射不是一对一的。例如,由于本地时间区的变化,如夏令时(DST),可能UNIX_TIMESTAMP()
将两个非UTC时间区的值映射到同一个Unix时间戳值。FROM_UNIXTIME()
将该值映射回原来的一个值。以下是一个示例,使用MET时间区的值:mysql> SET time_zone = 'MET'; mysql> SELECT UNIX_TIMESTAMP('2005-03-27 03:00:00'); +---------------------------------------+ | UNIX_TIMESTAMP('2005-03-27 03:00:00') | +---------------------------------------+ | 1111885200 | +---------------------------------------+ mysql> SELECT UNIX_TIMESTAMP('2005-03-27 02:00:00'); +---------------------------------------+ | UNIX_TIMESTAMP('2005-03-27 02:00:00') | +---------------------------------------+ | 1111885200 | +---------------------------------------+ mysql> SELECT FROM_UNIXTIME(1111885200); +---------------------------+ | FROM_UNIXTIME(1111885200) | +---------------------------+ | 2005-03-27 03:00:00 | +---------------------------+
Note要使用命名时间区,如
'MET'
或'Europe/Amsterdam'
,必须正确设置时间区表。请参阅第7.1.15节,“MySQL Server Time Zone Support”。如果您想减去
UNIX_TIMESTAMP()
列,您可能想要将它们转换为有符号整数。请参阅第14.10节,“Cast Functions and Operators”。 -
返回当前UTC日期作为一个值,格式为
'
或YYYY-MM-DD
'YYYYMMDD
,取决于函数在字符串或数字上下文中使用。mysql> SELECT UTC_DATE(), UTC_DATE() + 0; -> '2003-08-14', 20030814
-
返回当前UTC时间作为一个值,格式为
'hh:mm:ss'
或hhmmss
,取决于函数在字符串或数字上下文中使用。如果给定了
fsp
参数指定小数秒精度从0到6,则返回值包括小数秒部分该多个位。mysql> SELECT UTC_TIME(), UTC_TIME() + 0; -> '18:07:53', 180753.000000
-
UTC_TIMESTAMP
,UTC_TIMESTAMP([
fsp
])返回当前UTC日期和时间作为一个值,格式为
'
或YYYY-MM-DD hh:mm:ss
'YYYYMMDDhhmmss
,取决于函数在字符串或数字上下文中使用。如果给定了
fsp
参数指定小数秒精度从0到6,则返回值包括小数秒部分该多个位。mysql> SELECT UTC_TIMESTAMP(), UTC_TIMESTAMP() + 0; -> '2003-08-14 18:08:04', 20030814180804.000000
-
这个函数返回
日期
的周数。二个参数形式的WEEK()
允许你指定周是否从星期天开始还是星期一开始,并且返回值是否在0
到53
或者1
到53
之间。如果缺少模式
参数,使用default_week_format
系统变量的值。见第7.1.8节,“服务器系统变量”。对于NULL
日期值,函数返回NULL
。以下表格描述了
模式
参数的工作方式。Mode First day of week Range Week 1 is the first week … 0 星期天 0-53 这个年份中有星期天 1 星期一 0-53 这个年份中有 4 天以上 2 星期天 1-53 这个年份中有星期天 3 星期一 1-53 这个年份中有 4 天以上 4 星期天 0-53 这个年份中有 4 天以上 5 星期一 0-53 这个年份中有星期一 6 星期天 1-53 这个年份中有 4 天以上 7 星期一 1-53 今年有一个星期一 对于
mode
值的含义为““在今年至少4天,””周以ISO 8601:1988编号:-
如果包含1月1日的周有4天以上是在新年,那么是周1。
-
否则,它是上一年最后一周,下一个周是周1。
mysql> SELECT WEEK('2008-02-20'); -> 7 mysql> SELECT WEEK('2008-02-20',0); -> 7 mysql> SELECT WEEK('2008-02-20',1); -> 8 mysql> SELECT WEEK('2008-12-31',1); -> 53
如果日期落在上一年最后一周,MySQL返回
0
,除非使用2
、3
、6
或7
作为可选的mode
参数:mysql> SELECT YEAR('2000-01-01'), WEEK('2000-01-01',0); -> 2000, 0
有人可能认为
WEEK()
应该返回52
因为给定的日期实际上是在1999年的52周。WEEK()
返回0
,以便返回值是“给定的年中的周号。”这使得使用WEEK()
函数时结果可靠,结合其他函数提取日期部分。如果你想以给定的日期的周首日所在年计算结果,使用
0
、2
、5
或7
作为可选的mode
参数。mysql> SELECT WEEK('2000-01-01',2); -> 52
或者使用
YEARWEEK()
函数:mysql> SELECT YEARWEEK('2000-01-01'); -> 199952 mysql> SELECT MID(YEARWEEK('2000-01-01'),5,2); -> '52'
-
-
返回
日期
的星期几索引(0 = 星期一,1 = 星期二,… 6 = 星期天)。如果日期
是NULL
,则返回NULL
。mysql> SELECT WEEKDAY('2008-02-03 22:23:00'); -> 6 mysql> SELECT WEEKDAY('2007-11-06'); -> 1
-
返回
日期
的周次号,从1
到53
之间。返回NULL
如果日期
是NULL
。WEEKOFYEAR()
是一个兼容函数,等同于WEEK(
。日期
,3)mysql> SELECT WEEKOFYEAR('2008-02-20'); -> 8
-
返回日期
date
的年份,范围为1000
到9999
,或0
对于“零”日期。如果date
是NULL
则返回NULL
。mysql> SELECT YEAR('1987-01-01'); -> 1987
-
YEARWEEK(
,date
)YEARWEEK(
date
,mode
)返回日期的年份和周数。结果中的年份可能与日期参数中的年份不同,首周和尾周除外。如果
date
是NULL
则返回NULL
。参数
mode
和WEEK()
的参数相同。单个参数语法中,使用mode
值为 0。与WEEK()
不同的是,default_week_format
不影响YEARWEEK()
。mysql> SELECT YEARWEEK('1987-01-01'); -> 198652