本节描述了可以用来操作时间值的函数。请参阅第 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
,INTERVALexpr
unit
)DATE_SUB(
date
,INTERVALexpr
unit
)这些函数执行日期算术。
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:ss
followed 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
年份,数字(两位数字) %%
一个文字 %
字符%
x
x
,对于任何未列出的 “x
”由于 MySQL 允许存储不完整的日期,例如
'2014-00-00'
,因此月份和日份specifier 的范围从零开始。用于日和月份名称和缩写的语言由
lc_time_names
系统变量控制(见 第 12.16 节,“MySQL 服务器语言支持”)。对于
%U
、%u
、%V
和%v
specifier,请参阅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 服务器语言支持”)。如果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.000000
NOW()
返回一个常量时间,表示语句开始执行的时间。(在存储函数或触发器中,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_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.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(
,日期
,INTERVALexpr
unit
)SUBDATE(
expr
,天
)当使用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'
第二种形式启用了使用整数值
天
。在这种情况下,它被解释为从日期或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'); -> 128885
Note该函数的日期或日期时间参数顺序与
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'); -> 733321
TO_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_DATES
SQL 服务器模式启用或禁用时都是如此。 -
给定日期或 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_DATES
SQL 服务器模式。 -
如果
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