本节介绍可用于操作时间值的函数。有关每个日期和时间类型的值范围以及可以指定值的有效格式的描述,请参见第 13.2 节“日期和时间数据类型”。
表 14.11 日期和时间函数
| 名称 | 描述 |
|---|---|
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() |
当使用三个参数调用时,SUBDATE() 的同义词 |
SUBTIME() |
减去时间 |
SYSDATE() |
返回函数执行的时间 |
TIME() |
提取传递的表达式的時間部分 |
TIME_FORMAT() |
格式化为时间 |
TIME_TO_SEC() |
返回参数转换为秒 |
TIMEDIFF() |
减去时间 |
TIMESTAMP() |
使用单个参数,此函数返回日期或 datetime 表达式;使用两个参数,返回参数的总和 |
TIMESTAMPADD() |
将间隔添加到 datetime 表达式 |
TIMESTAMPDIFF() |
返回两个 datetime 表达式的差值,使用指定的单位 |
TO_DAYS() |
返回日期参数转换为天 |
TO_SECONDS() |
返回日期或 datetime 参数转换为自公元 0 年以来的秒数 |
UNIX_TIMESTAMP() |
返回 Unix 时间戳 |
UTC_DATE() |
返回当前 UTC 日期 |
UTC_TIME() |
返回当前 UTC 时间 |
UTC_TIMESTAMP() |
返回当前 UTC 日期和时间 |
WEEK() |
返回星期数 |
WEEKDAY() |
返回星期索引 |
WEEKOFYEAR() |
返回日期的日历周(1-53) |
YEAR() |
返回年份 |
YEARWEEK() |
返回年份和星期 |
以下是一个使用日期函数的示例。以下查询选择所有具有在过去 30 天内的 date_col 值的行
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() 假设其参数是会话时区中的日期时间值。请参见 第 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(、date,INTERVALexprunit)ADDDATE(date,days)当使用第二个参数的
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'当使用第二个参数的
days形式调用时,MySQL 将其视为要添加到expr的整数天数。mysql> SELECT ADDDATE('2008-01-02', 31); -> '2008-02-02'如果
date或days为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()将日期时间值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 版本如何,如果从
from_tz转换为 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'注意要使用命名时区(如
'MET'或'Europe/Amsterdam'),必须正确设置时区表。有关说明,请参见 第 7.1.15 节,“MySQL 服务器时区支持”。以
'或YYYY-MM-DD'YYYYMMDD格式返回当前日期的值,具体取决于函数是在字符串上下文中还是数字上下文中使用。mysql> SELECT CURDATE(); -> '2008-06-13' mysql> SELECT CURDATE() + 0; -> 20080613CURRENT_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,表示为从一个日期到另一个日期的天数。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,INTERVALexprunit)DATE_SUB(date,INTERVALexprunit)这些函数执行日期运算。
date参数指定起始日期或日期时间值。expr是一个表达式,指定要从起始日期加或减去的间隔值。expr作为字符串进行计算;它可能以-开头,表示负间隔。unit是一个关键字,指示应解释表达式的单位。有关时间间隔语法的更多信息,包括
unit指定符的完整列表、每个unit值的expr参数的预期形式以及时间运算中操作数解释的规则,请参见 时间间隔。返回值取决于参数
如果
date为NULL,则函数返回NULL。DATE如果date参数是DATE值,并且您的计算只涉及YEAR、MONTH和DAY部分(即没有时间部分)。TIME如果date参数是TIME值,并且计算只涉及HOURS、MINUTES和SECONDS部分(即没有日期部分)。DATETIME如果第一个参数是DATETIME(或TIMESTAMP)值,或者如果第一个参数是DATE并且unit值使用HOURS、MINUTES或SECONDS,或者如果第一个参数的类型为TIME并且unit值使用YEAR、MONTH或DAY。如果第一个参数是动态参数(例如,预处理语句),则其解析类型为
DATE如果第二个参数是包含YEAR、MONTH或DAY值组合的间隔;否则,其类型为DATETIME。否则为字符串(类型为
VARCHAR)。
为了确保结果为
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()。说明符 描述 %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)%pAM或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星期名称 ( Sunday..Saturday)%w星期的日期 ( 0=星期日..6=星期六)%X以星期日为一周的第一天的星期的年份,数字,四位数;与 %V结合使用%x以星期一为一周的第一天的星期的年份,数字,四位数;与 %v结合使用%Y年份,数字,四位数 %y年份,数字 (两位数) %%一个字面上的 %字符%xx,对于上面未列出的任何 “x”月份和日期说明符的范围从零开始,因为 MySQL 允许存储不完整的日期,如
'2014-00-00'。用于星期和月份名称和缩写的语言由
lc_time_names系统变量的值控制 (Section 12.16, “MySQL Server Locale Support”).对于
%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,INTERVALexprunit)参见
DATE_ADD()的描述。DAY()是DAYOFMONTH()的同义词。返回
date的星期的名称。用于名称的语言由lc_time_names系统变量的值控制(参见Section 12.16, “MySQL Server Locale Support”)。如果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= 星期六)。这些索引值对应于 ODBC 标准。如果date为NULL,则返回NULL。mysql> SELECT DAYOFWEEK('2007-02-03'); -> 7返回
date的年中的日期,范围为1到366。如果date为NULL,则返回NULL。mysql> SELECT DAYOFYEAR('2007-02-03'); -> 34EXTRACT()函数使用与DATE_ADD()或DATE_SUB()相同的unit说明符,但从日期中提取部分,而不是执行日期运算。有关unit参数的信息,请参见Temporal Intervals。如果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, “What Calendar Is Used By MySQL?”.FROM_UNIXTIME(unix_timestamp[,format])返回
unix_timestamp的表示形式,为日期时间或字符字符串值。返回值使用会话时区表示。(客户端可以设置会话时区,如Section 7.1.15, “MySQL Server Time Zone Support”中所述。)unix_timestamp是一个内部时间戳值,表示自'1970-01-01 00:00:00'UTC 以来的秒数,例如由UNIX_TIMESTAMP()函数产生的秒数。如果省略了
format,则此函数返回一个DATETIME值。如果
unix_timestamp或format为NULL,则此函数返回NULL。如果
unix_timestamp是整数,则DATETIME的小数秒精度为零。当unix_timestamp为十进制值时,DATETIME的小数秒精度与十进制值的精度相同,最大为 6。当unix_timestamp为浮点数时,日期时间的小数秒精度为 6。在 32 位平台上,
unix_timestamp的最大有效值为 2147483647.999999,它返回'2038-01-19 03:14:07.999999'UTC。在 64 位平台上,有效最大值为 32536771199.999999,它返回'3001-01-18 23:59:59.999999'UTC。无论平台或版本如何,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'注意如果您使用
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。函数调用 结果 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'返回
time的小时。对于一天中的时间值,返回值的范围是0到23。但是,TIME值的实际范围要大得多,因此HOUR可以返回大于23的值。如果time为NULL,则返回NULL。mysql> SELECT HOUR('10:05:03'); -> 10 mysql> SELECT HOUR('272:59:59'); -> 272接受日期或日期时间值,并返回对应月份的最后一天的值。如果参数无效或为
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'); -> NULLLOCALTIME和LOCALTIME()是NOW()的同义词。LOCALTIMESTAMP,LOCALTIMESTAMP([fsp])LOCALTIMESTAMP和LOCALTIMESTAMP()是NOW()的同义词。返回给定年份和一年中的天数的值的日期。
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。second参数可以有小数部分。mysql> SELECT MAKETIME(12,15,30); -> '12:15:30'返回时间或日期时间表达式
expr中的微秒,以0到999999范围内的数字表示。如果expr为NULL,则返回NULL。mysql> SELECT MICROSECOND('12:00:00.123456'); -> 123456 mysql> SELECT MICROSECOND('2019-12-31 23:59:59.000010'); -> 10返回
time的分钟,范围为0到59,如果time为NULL,则返回NULL。mysql> SELECT MINUTE('2008-02-03 10:05:03'); -> 5返回
date的月份,范围为1到12(分别对应一月到十二月),对于月份部分为零的日期(如'0000-00-00'或'2008-00-00'),返回0。如果date为NULL,则返回NULL。mysql> SELECT MONTH('2008-02-03'); -> 2返回
date的月份全称。用于名称的语言由lc_time_names系统变量的值控制(第 12.16 节,“MySQL 服务器区域设置支持”)。如果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.000000NOW()返回一个常量时间,表示语句开始执行的时间。(在存储函数或触发器中,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()的描述。将
N个月添加到周期P(格式为YYMM或YYYYMM)。返回YYYYMM格式的值。注意周期参数
P不是 日期值。如果
P或N为NULL,则该函数返回NULL。mysql> SELECT PERIOD_ADD(200801,2); -> 200803返回周期
P1和P2之间的月份数。P1和P2应为YYMM或YYYYMM格式。请注意,周期参数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中提取的日期、时间或日期时间值无法根据服务器遵循的规则进行解析,则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不匹配,则失败。str末尾的额外字符将被忽略。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中不完整指定的值将生成一个结果,其中某些或所有部分都设置为 0mysql> 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 类型” 中所述。这意味着,例如,除非 SQL 模式设置为禁止此类值,否则允许使用 “零” 日期或日期部分值都为 0 的日期。
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_DATESQL 模式,则不允许使用零日期。在这种情况下,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 9.0 中,STR_TO_DATE()执行完整的范围检查,如果转换后的日期无效,则会引发错误。注意您不能使用格式
"%X%V"将年周字符串转换为日期,因为如果周跨越月份边界,则年份和周的组合无法唯一标识年份和月份。要将年周转换为日期,您还应指定星期几mysql> SELECT STR_TO_DATE('200442 Monday', '%X%V %W'); -> '2004-10-18'您还需要知道,对于日期和日期时间值中的日期部分,
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,INTERVALexprunit)SUBDATE(expr,days)当使用第二个参数的
INTERVAL形式调用时,SUBDATE()是DATE_SUB()的同义词。有关INTERVALunit参数的信息,请参见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。在这种情况下,它被解释为要从日期或日期时间表达式expr中减去的天的数量。mysql> SELECT SUBDATE('2008-01-02 12:00:00', 31); -> '2007-12-02 12:00:00'如果任何参数为
NULL,则此函数返回NULL。SUBTIME()返回expr1−expr2,表示为与expr1相同格式的值。expr1是时间或日期时间表达式,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作为日期时间值返回。如果包含两个参数,则将时间表达式expr2添加到日期或日期时间表达式expr1,并将结果作为日期时间值返回。如果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注意此函数的日期或日期时间参数的顺序与使用 2 个参数调用
TIMESTAMP()函数时使用的顺序相反。此函数的使用方式与
DATE_FORMAT()函数相同,但format字符串可能仅包含小时、分钟、秒和微秒的格式说明符。其他说明符会生成NULL或0。如果time或format为NULL,则TIME_FORMAT()返回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参数,转换为秒。如果time为NULL,则返回NULL。mysql> SELECT TIME_TO_SEC('22:23:00'); -> 80580 mysql> SELECT TIME_TO_SEC('00:39:38'); -> 2378给定日期
date,返回一个天数(自公元 0 年以来的天数)。如果date为NULL,则返回NULL。mysql> SELECT TO_DAYS(950501); -> 728779 mysql> SELECT TO_DAYS('2007-10-07'); -> 733321TO_DAYS()不适用于格里高利历(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_DATESSQL 服务器模式,情况都是如此。给定日期或日期时间
expr,返回自公元 0 年以来的秒数。如果expr不是有效的日期或日期时间值(包括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_DATESSQL 服务器模式,情况都是如此。如果
UNIX_TIMESTAMP()在没有date参数的情况下被调用,它将返回一个 Unix 时间戳,表示自'1970-01-01 00:00:00'UTC 以来的秒数。如果
UNIX_TIMESTAMP()在有date参数的情况下被调用,它将返回该参数的值,表示自'1970-01-01 00:00:00'UTC 以来的秒数。服务器将date解释为会话时区中的一个值,并将其转换为 UTC 中的内部 Unix 时间戳值。(客户端可以设置会话时区,如 第 7.1.15 节,“MySQL 服务器时区支持” 中所述。)date参数可以是DATE、DATETIME或TIMESTAMP字符串,或YYMMDD、YYMMDDhhmmss、YYYYMMDD或YYYYMMDDhhmmss格式的数字。如果参数包含时间部分,则可以可选地包含小数秒部分。如果未给出参数或参数不包含小数秒部分,则返回值为整数;如果给出包含小数秒部分的参数,则返回值为
DECIMAL。当
date参数为TIMESTAMP列时,UNIX_TIMESTAMP()将直接返回内部时间戳值,不会进行隐式 “字符串到 Unix 时间戳” 转换。参数值的有效范围与
TIMESTAMP数据类型相同:对于 32 位平台,UTC 时间为'1970-01-01 00:00:01.000000'到'2038-01-19 03:14:07.999999';对于在 64 位平台上运行的 MySQL,UNIX_TIMESTAMP()的参数值的有效范围为 UTC 时间'1970-01-01 00:00:01.000000'到'3001-01-19 03:14:07.999999'(对应于 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 | +---------------------------+注意要使用命名时区(如
'MET'或'Europe/Amsterdam'),必须正确设置时区表。有关说明,请参见 第 7.1.15 节,“MySQL 服务器时区支持”。如果您想减去
UNIX_TIMESTAMP()列,您可能想要将其转换为带符号的整数。请参阅 第 14.10 节,“强制转换函数和运算符”。返回当前 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.000000UTC_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此函数返回
date的周数。WEEK()的两个参数形式使您可以指定周是从星期日开始还是从星期一开始,以及返回值应该在0到53范围内还是在1到53范围内。如果省略了mode参数,则使用default_week_format系统变量的值。请参阅 第 7.1.8 节,“服务器系统变量”。对于NULL日期值,该函数将返回NULL。下表描述了
mode参数的工作原理。模式 一周的第一天 范围 第一周是 … 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 天或更多天,则该周为第一周。
否则,该周为前一年的最后一周,下一周为第一周。
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如果日期落在前一年的最后一周,如果您没有使用
2、3、6或7作为可选的mode参数,MySQL 将返回0。mysql> SELECT YEAR('2000-01-01'), WEEK('2000-01-01',0); -> 2000, 0有人可能会争辩说,
WEEK()应该返回52,因为给定的日期实际上发生在 1999 年的第 52 周。WEEK()返回0而不是52,以便返回值为 “给定年份中的周数。” 这使得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'返回
date的星期几索引(0= 星期一,1= 星期二,…6= 星期日)。如果date为NULL,则返回NULL。mysql> SELECT WEEKDAY('2008-02-03 22:23:00'); -> 6 mysql> SELECT WEEKDAY('2007-11-06'); -> 1返回该日期的日历周,以
1到53范围内的数字表示。如果date为NULL,则返回NULL。WEEKOFYEAR()是一个兼容性函数,等效于WEEK(。date,3)mysql> SELECT WEEKOFYEAR('2008-02-20'); -> 8返回
date的年份,范围为1000到9999,或对于 “零” 日期返回0。如果date为NULL,则返回NULL。mysql> SELECT YEAR('1987-01-01'); -> 1987YEARWEEK(、date)YEARWEEK(date,mode)返回日期的年份和周。结果中的年份可能与日期参数中的一年不同,因为这是针对一年的第一周和最后一周而言的。如果
date为NULL,则返回NULL。mode参数的工作原理与WEEK()的mode参数完全相同。对于单参数语法,使用mode值 0。与WEEK()不同,default_week_format的值不会影响YEARWEEK()。mysql> SELECT YEARWEEK('1987-01-01'); -> 198652对于可选参数
0或1,周数与WEEK()函数返回的周数不同(0),因为WEEK()然后返回给定年份中的周数。