本节介绍可用于处理时间值的函数。有关每种日期和时间类型的取值范围以及可以指定值的有效格式的说明,请参阅第 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() |
提取日期或日期时间表达式的日期部分 |
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() |
返回转换为自 0 年以来的秒数的日期或日期时间参数 |
UNIX_TIMESTAMP() |
返回 Unix 时间戳 |
UTC_DATE() |
返回当前 UTC 日期 |
UTC_TIME() |
返回当前 UTC 时间 |
UTC_TIMESTAMP() |
返回当前 UTC 日期和时间 |
WEEK() |
返回周数 |
WEEKDAY() |
返回星期几索引 |
WEEKOFYEAR() |
返回日期的日历周 (1-53) |
YEAR() |
返回年份 |
YEARWEEK() |
返回年份和周数 |
以下是一个使用日期函数的示例。以下查询选择 date_col
值在过去 30 天内的所有行
mysql> SELECT something FROM tbl_name
-> WHERE DATE_SUB(CURDATE(),INTERVAL 30 DAY) <= date_col;
该查询还选择日期在未来的行。
期望使用日期值的函数通常接受日期时间值并忽略时间部分。期望使用时间值的函数通常接受日期时间值并忽略日期部分。
返回当前日期或时间的函数在每次查询开始执行时只计算一次。这意味着在单个查询中多次引用诸如 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(
、日期
,INTERVAL表达式
单位
)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 将其视为要添加到表达式
中的整数天数。mysql> SELECT ADDDATE('2008-01-02', 31); -> '2008-02-02'
如果
日期
或天数
为NULL
,则此函数返回NULL
。ADDTIME()
将表达式2
添加到表达式1
并返回结果。表达式1
是时间或日期时间表达式,表达式2
是时间表达式。如果表达式1
或表达式2
为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; -> 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 | +--------------+
提取日期或日期时间表达式
表达式
的日期部分。如果表达式
为NULL
,则返回NULL
。mysql> SELECT DATE('2003-12-31 01:02:03'); -> '2003-12-31'
DATEDIFF()
返回表达式1
−表达式2
,表示为从一个日期到另一个日期的天数。表达式1
和表达式2
是日期或日期时间表达式。计算中仅使用值的日期部分。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
如果
表达式1
或表达式2
为NULL
,则此函数返回NULL
。DATE_ADD(
、日期
,INTERVAL表达式
单位
)DATE_SUB(
日期
,INTERVAL表达式
单位
)这些函数执行日期算术。
日期
参数指定起始日期或日期时间值。表达式
是一个表达式,用于指定要与起始日期相加或相减的时间间隔值。表达式
被评估为字符串;它可以以-
开头表示负时间间隔。单位
是一个关键字,指示应如何解释表达式中的单位。有关时间间隔语法(包括
单位
说明符的完整列表、每个单位
值的表达式
参数的预期形式,以及时间算术中操作数解释的规则)的更多信息,请参阅时间间隔。返回值取决于参数
如果
日期
为NULL
,则该函数返回NULL
。如果
日期
参数是DATE
值,并且您的计算仅涉及YEAR
、MONTH
和DAY
部分(即没有时间部分),则返回DATE
。如果
日期
参数是TIME
值,并且计算仅涉及HOURS
、MINUTES
和SECONDS
部分(即没有日期部分),则返回TIME
。如果第一个参数是
DATETIME
(或TIMESTAMP
)值,或者如果第一个参数是DATE
且单位
值使用HOURS
、MINUTES
或SECONDS
,或者如果第一个参数的类型为TIME
且单位
值使用YEAR
、MONTH
或DAY
,则返回DATETIME
。如果第一个参数是动态参数(例如,预处理语句的参数),则如果第二个参数是仅包含
YEAR
、MONTH
或DAY
值的某种组合的时间间隔,则其解析类型为DATE
;否则,其类型为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'
当向
DATE
或DATETIME
值添加MONTH
间隔时,如果结果日期包含给定月份中不存在的日期,则日期将调整为该月的最后一天,如下所示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
)%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
星期几名称( Sunday
..Saturday
)%w
星期几( 0
=星期日..6
=星期六)%X
星期日为每周第一天的年份,数字,四位数;与 %V
一起使用%x
星期一为每周第一天的年份,数字,四位数;与 %v
一起使用%Y
年份,数字,四位数 %y
年份,数字(两位数) %%
文字 %
字符%
x
对于上面未列出的任何 “ x
”,x
月份和日期说明符的范围从零开始,因为 MySQL 允许存储不完整的日期,例如
'2014-00-00'
。用于星期几和月份名称及缩写的语言由
lc_time_names
系统变量的值控制(第 12.16 节“MySQL 服务器区域设置支持”)。有关
%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 服务器区域设置支持”)。如果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'); -> 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 年)的值。请参阅 第 13.2.7 节“MySQL 使用什么日历?”。FROM_UNIXTIME(
unix_timestamp
[,format
])以日期时间或字符串值的形式返回
unix_timestamp
的表示形式。返回值使用会话时区表示。(客户端可以按照 第 7.1.15 节“MySQL 服务器时区支持” 中的说明设置会话时区。)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
是浮点数时,日期时间的小数秒精度为 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'); -> NULL
LOCALTIME
和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 月的范围为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.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()
的说明。将
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
中未完全指定的值会产生部分或全部部分设置为 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 节 “日期、日期时间和时间戳类型” 中所述。这意味着,例如,允许使用 “零” 日期或部分值为 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()
会执行完整的范围检查,如果转换后的日期无效,则会引发错误。注意不能使用格式
"%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(
,日期
,INTERVAL表达式
单位
)SUBDATE(
表达式
,天数
)当使用第二个参数的
INTERVAL
形式调用时,SUBDATE()
是DATE_SUB()
的同义词。有关INTERVAL
单位
参数的信息,请参见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'
第二种形式允许对
天数
使用整数值。在这种情况下,它被解释为要从日期或日期时间表达式表达式
中减去的天数。mysql> SELECT SUBDATE('2008-01-02 12:00:00', 31); -> '2007-12-02 12:00:00'
如果任何参数为
NULL
,则此函数返回NULL
。SUBTIME()
返回表达式1
-表达式2
,其值格式与表达式1
相同。表达式1
是时间或日期时间表达式,而表达式2
是时间表达式。此函数返回类型的解析方式与
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'
如果
表达式1
或表达式2
为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()
的不确定性也意味着索引不能用于评估引用它的表达式。提取时间或日期时间表达式
表达式
的时间部分,并将其作为字符串返回。如果表达式
为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()
返回表达式1
-表达式2
,表示为时间值。表达式1
和表达式2
是转换为TIME
或DATETIME
表达式的字符串;转换后,它们必须属于同一类型。如果表达式1
或表达式2
为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(
,表达式
)TIMESTAMP(
表达式1
,表达式2
)对于单个参数,此函数将日期或日期时间表达式
表达式
作为日期时间值返回。对于两个参数,它将时间表达式表达式2
添加到日期或日期时间表达式表达式1
中,并将结果作为日期时间值返回。如果表达式
、表达式1
或表达式2
为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(
单位
,时间间隔
,datetime_expr
)将整数表达式
时间间隔
添加到日期或日期时间表达式datetime_expr
中。时间间隔
的单位由单位
参数给出,该参数应为以下值之一:MICROSECOND
(微秒)、SECOND
、MINUTE
、HOUR
、DAY
、WEEK
、MONTH
、QUARTER
或YEAR
。单位
值可以使用所示的关键字之一或SQL_TSI_
的前缀指定。例如,DAY
和SQL_TSI_DAY
都是合法的。如果
时间间隔
或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'
当向
DATE
或DATETIME
值添加MONTH
间隔时,如果结果日期包含给定月份中不存在的日期,则日期将调整为该月的最后一天,如下所示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(
单位
,datetime_expr1
,datetime_expr2
)返回
datetime_expr2
-datetime_expr1
,其中datetime_expr1
和datetime_expr2
是日期或日期时间表达式。一个表达式可以是日期,另一个表达式可以是日期时间;日期值在必要时被视为时间部分为'00:00:00'
的日期时间。结果的单位(一个整数)由单位
参数给出。单位
的合法值与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()
函数的使用方式类似,但格式
字符串只能包含小时、分钟、秒和微秒的格式说明符。其他说明符将生成NULL
或0
。如果时间
或格式
为NULL
,则TIME_FORMAT()
返回NULL
。如果
时间
值包含的小时部分大于23
,则%H
和%k
小时格式说明符生成的值将大于0..23
的通常范围。其他小时格式说明符生成的小时值为模 12。mysql> SELECT TIME_FORMAT('100:00:00', '%H %k %h %I %l'); -> '100 100 04 04 4'
返回转换为秒的
时间
参数。如果时间
为NULL
,则返回NULL
。mysql> SELECT TIME_TO_SEC('22:23:00'); -> 80580 mysql> SELECT TIME_TO_SEC('00:39:38'); -> 2378
给定日期
日期
,返回一个天数(自 0 年以来的天数)。如果日期
为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 服务器模式,都是如此。给定日期或日期时间
表达式
,返回自 0 年以来的秒数。如果表达式
不是有效的日期或日期时间值(包括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 服务器模式,都是如此。如果在没有
date
参数的情况下调用UNIX_TIMESTAMP()
,它会返回一个 Unix 时间戳,表示自'1970-01-01 00:00:00'
UTC 以来的秒数。如果使用
date
参数调用UNIX_TIMESTAMP()
,它会返回自'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 节 “强制转换函数和运算符”。以
'
或YYYY-MM-DD
'YYYYMMDD
格式返回当前 UTC 日期,具体取决于该函数是在字符串上下文还是数字上下文中使用。mysql> SELECT UTC_DATE(), UTC_DATE() + 0; -> '2003-08-14', 20030814
以
'hh:mm:ss'
或hhmmss
格式返回当前 UTC 时间,具体取决于该函数是在字符串上下文还是数字上下文中使用。如果给出了
fsp
参数来指定从 0 到 6 的小数秒精度,则返回值将包含该位数的小数秒部分。mysql> SELECT UTC_TIME(), UTC_TIME() + 0; -> '18:07:53', 180753.000000
UTC_TIMESTAMP
,UTC_TIMESTAMP([
fsp
])以
'
或YYYY-MM-DD hh:mm:ss
'YYYYMMDDhhmmss
格式返回当前 UTC 日期和时间,具体取决于该函数是在字符串上下文还是数字上下文中使用。如果给出了
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
参数的工作原理。模式 一周的第一天 范围 第 1 周是第一周… 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 今年包含星期一 对于含义为“今年有 4 天或更多天”的
mode
值,周数按照 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
如果日期落在前一年的最后一周,并且您没有使用
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
,以便返回值是“给定年份中的周数”。这使得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
以
1000
到9999
范围内的数字形式返回date
的年份,对于“零”日期,则返回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
周数与
WEEK()
函数针对可选参数0
或1
返回的周数(0
)不同,因为WEEK()
会返回给定年份上下文中的周数。