本节描述了可以用来操作时间值的函数。请参阅第 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() |
从日期或日期时间表达式中提取日期部分 |
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() |
使用单个参数时,该函数返回日期或日期时间表达式;使用两个参数时,返回参数的和 |
TIMESTAMPADD() |
将间隔添加到日期时间表达式 |
TIMESTAMPDIFF() |
使用指定的单位返回两个日期时间表达式之间的差异 |
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 天内的 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() 假设其参数是一个 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()。
时间、日期时间和时间戳值支持小数秒,精度高达微秒。接受时间参数的函数也接受小数秒值。从时间函数返回的值也包括小数秒。
-
ADDDATE(,日期,INTERVALexpr单位)ADDDATE(日期,天数)当使用 INTERVAL 形式的第二个参数时,
ADDDATE()是DATE_ADD()的同义词。相关函数SUBDATE()是DATE_SUB()的同义词。有关 INTERVAL单位参数的信息,请参阅 时间间隔。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如果date或days是NULL。 -
ADDTIME()将expr2添加到expr1并返回结果。expr1是时间或日期时间表达式,expr2是时间表达式。返回NULL如果expr1或expr2是NULL。该函数和
SUBTIME()函数的返回类型是根据以下规则确定的:-
如果第一个参数是动态参数(例如,在 prepared 语句中),则返回类型是
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'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表示为从一个日期到另一个日期的天数。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。 -
如果第一个参数是一个动态参数(例如,prepared 语句),其解析类型是
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) -
-
根据
日期值和格式字符串格式化日期。如果两个参数中的任何一个是NULL,则函数返回NULL。以下表格中的指定符可以在
格式字符串中使用。%字符在格式指定符之前是必需的。这些指定符也适用于其他函数:STR_TO_DATE()、TIME_FORMAT()和UNIX_TIMESTAMP()。Specifier Description %a缩写的星期名称 ( 日..六)%b缩写的月份名称 ( 一月..十二月)%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月份名称 ( 一月..十二月)%m月份,数字 ( 00..12)%p上午或下午%r时间,12小时 ( hh:mm:ssfollowed by上午or下午)%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年份,数字,四位数字 %y年份,数字(两位数字) %%一个文字 %字符%xx,对于任何未列出的 “x”由于 MySQL 允许存储不完整的日期,例如
'2014-00-00',因此月份和日份specifier 的范围从零开始。用于日和月份名称和缩写的语言由
lc_time_names系统变量控制(见 第 12.16 节,“MySQL 服务器语言支持”)。对于
%U、%u、%V和%vspecifier,请参阅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系统变量控制(见 第 12.16 节,“MySQL 服务器语言支持”)。如果date为NULL,则返回NULL。mysql> SELECT DAYNAME('2007-02-03'); -> 'Saturday' -
返回
日期的月份中的天数,在1到31之间的范围内,或者对于日期如'0000-00-00'或'2008-00-00'这样的日期,返回0。如果日期是NULL,则返回NULL。mysql> SELECT DAYOFMONTH('2007-02-03'); -> 3 -
返回
日期的星期索引(1= 星期天,2= 星期一,…,7= 星期六)。这些索引值对应 ODBC 标准。如果日期是NULL,则返回NULL。mysql> SELECT DAYOFWEEK('2007-02-03'); -> 7 -
返回
日期的年份中的天数,在1到366之间的范围内。如果日期是NULL,则返回NULL。mysql> SELECT DAYOFYEAR('2007-02-03'); -> 34 -
该
EXTRACT()函数使用与DATE_ADD()或DATE_SUB()相同的单位规范,但从日期中提取部分,而不是执行日期算术。有关单位参数的信息,请参阅 时间间隔。如果日期是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年)之前的日期。请参阅 第 13.2.7 节,“MySQL 使用的日历是什么?”。 -
FROM_UNIXTIME(unix_timestamp[,format])返回
unix_timestamp的 datetime 或字符字符串值。返回的值使用会话时区表示。(客户端可以按照 第 7.1.15 节,“MySQL 服务器时区支持” 中所述设置会话时区。)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是浮点数时,datetime 的小数秒精度为 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'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'获取格式(DATETIME,'EUR')'%Y-%m-%d %H.%i.%s'获取格式(DATETIME,'INTERNAL')'%Y%m%d%H%i%s'获取格式(TIME,'USA')'%h:%i:%s %p'获取格式(TIME,'JIS')'%H:%i:%s'获取格式(TIME,'ISO')'%H:%i:%s'获取格式(TIME,'EUR')'%H.%i.%s'获取格式(TIME,'INTERNAL')'%H%i%s'TIMESTAMP也可以用作获取格式()的第一个参数,在这种情况下,函数返回与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值的实际范围要大得多,因此小时可以返回大于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'); -> NULL -
本地时间和LOCALTIME()是NOW()的同义词。 -
本地时间戳和LOCALTIMESTAMP()是NOW()的同义词。 -
返回给定年份和天数值的日期。
天数必须大于 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 -
返回根据
小时、分钟和秒参数计算的时间值。如果任何参数为NULL,则返回NULL。参数
秒可以有小数部分。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 -
返回
时间的分钟数,范围从0到59,或如果时间为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 服务器 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.000000NOW()返回一个常量时间,表示语句开始执行的时间。(在存储函数或触发器中,NOW()返回函数或触发语句开始执行的时间。)这与SYSDATE()的行为不同,后者返回 exact 执行时间。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格式。Note期限参数
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中不完全指定的值将产生结果,其中一些或所有部分设置为 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_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 8.2.0(和后续创新版本)中,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节,“日期、DATETIME和TIMESTAMP类型”,以获取更多信息。 -
SUBDATE(,日期,INTERVALexprunit)SUBDATE(expr,天)当使用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'第二种形式启用了使用整数值
天。在这种情况下,它被解释为从日期或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)使用单个参数时,该函数将日期或datetime表达式
expr作为datetime值返回。使用两个参数时,它将时间表达式expr2添加到日期或datetime表达式expr1并将结果作为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表达式datetime_expr。interval的单位由unit参数指定,应该是以下值之一:MICROSECOND(微秒)、SECOND、MINUTE、HOUR、DAY、WEEK、MONTH、QUARTER或YEAR。可以使用关键字或带有
SQL_TSI_前缀来指定unit值。例如,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'); -> 128885Note该函数的日期或日期时间参数顺序与
TIMESTAMP()函数的参数顺序相反,当使用 2 个参数时。 -
这与
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参数转换为秒数。如果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 服务器模式启用或禁用时都是如此。 -
给定日期或 datetime
expr,返回自年0以来的秒数。如果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_DATESSQL 服务器模式。 -
如果
UNIX_TIMESTAMP()不带参数调用,它将返回一个 Unix 时间戳,表示从'1970-01-01 00:00:00'UTC 开始的秒数。如果
UNIX_TIMESTAMP()带有一个日期参数,它将返回参数的值作为从'1970-01-01 00:00:00'UTC 开始的秒数。服务器将日期解释为会话时区中的值,并将其转换为 UTC 的内部 Unix 时间戳值。(客户端可以按照 第 7.1.15 节,“MySQL 服务器时区支持” 中所述设置会话时区。)日期参数可以是一个DATE、DATETIME或TIMESTAMP字符串,或者是一个YYMMDD、YYMMDDhhmmss、YYYYMMDD或YYYYMMDDhhmmss格式的数字。如果参数包括时间部分,可以选择性地包括小数秒部分。如果不提供参数或参数不包括小数秒部分,返回值是一个整数;否则,如果参数包括小数秒部分,返回值是一个
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 位平台上运行的 MySQL,UNIX_TIMESTAMP()的有效参数值范围是'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 服务器时区支持”。如果您想减去
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.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 -
该函数返回
date的周号。两个参数形式的WEEK()允许您指定周是否从星期天或星期一开始,以及返回值是否在0到53之间或从1到53之间。如果省略了mode参数,则使用default_week_format系统变量的值。请参阅 第 7.1.8 节,“服务器系统变量”。对于 NULL 日期值,该函数返回NULL。以下表格描述了
mode参数的工作方式。Mode First day of week Range Week 1 is the first week … 0 星期天 0-53 今年星期天 1 星期一 0-53 今年四天或更多天 2 星期天 1-53 今年星期天 3 星期一 1-53 今年四天或更多天 4 星期天 0-53 今年四天或更多天 5 星期一 0-53 今年星期一 6 星期天 1-53 今年四天或更多天 7 星期一 1-53 今年星期一 对于
mode值具有“今年四天或更多天”的含义,周数将根据 ISO 8601:1988 编号:-
如果包含 1 月 1 日的周有四天或更多天在新的一年中,它是周 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()函数与其他从日期中提取日期部分的函数结合使用时可靠。如果您prefer 结果根据包含给定日期的第一天的年份进行评估,请使用
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'); -> 1987 -
YEARWEEK(,date)YEARWEEK(date,mode)返回日期的年份和周。结果中的年份可能与日期参数中的年份不同,特别是在一年中的第一周和最后一周。如果
date是NULL,则返回NULL。参数
mode的工作方式与WEEK()的mode参数相同。对于单参数语法,使用mode值 0。与WEEK()不同,default_week_format的值不会影响YEARWEEK()。mysql> SELECT YEARWEEK('1987-01-01'); -> 198652