日期时间函数
本节介绍可用于操纵时间值的功能。有关每种日期和时间类型具有的值范围以及可以指定值的有效格式的信息,请参见“日期和时间数据类型”。
表日期和时间函数
名称 | 描述 |
---|---|
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() | 仅使用一个参数,此函数将返回date或datetime表达式;有两个参数,参数的总和 |
TIMESTAMPADD() | 向日期时间表达式添加间隔 |
TIMESTAMPDIFF() | 从日期时间表达式中减去一个间隔 |
TO_DAYS() | 返回日期参数转换为天 |
TO_SECONDS() | 返回从Year 0开始转换为秒的date或datetime参数 |
UNIX_TIMESTAMP() | 返回Unix时间戳 |
UTC_DATE() | 返回当前UTC日期 |
UTC_TIME() | 返回当前UTC时间 |
UTC_TIMESTAMP() | 返回当前UTC日期和时间 |
WEEK() | 返回星期数 |
WEEKDAY() | 返回工作日索引 |
WEEKOFYEAR() | 返回日期的日历周(1-53) |
YEAR() | 返回年份 |
YEARWEEK() | 返回年和周 |
这是一个使用日期函数的示例。以下查询选择date_col
最近30天内具有值的所有行:
mysql>SELECT somethingFROM 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值。请参见“ 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,INTERVAL exprunit)
,ADDDATE(expr,days)
当以
INTERVAL
第二个参数的形式调用时,ADDDATE()
是的同义词DATE_ADD()
。相关功能SUBDATE()
是的同义词DATE_SUB()
。有关自INTERVAL
unit
变量的信息,请参见时间间隔。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'ADDTIME(expr1,expr2)
ADDTIME()
增加了expr2
对expr1
并返回结果。expr1
是时间或日期时间表达式,并且expr2
是时间表达式。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)
CONVERT_TZ()
将datetime值dt
从指定的时区转换为指定from_tz
的时区,to_tz
并返回结果值。如“ MySQL服务器时区支持”中所述指定时区。NULL
如果参数无效,则此函数返回。如果
TIMESTAMP
从转换from_tz
为UTC 时该值超出了类型的支持范围,则不会进行转换。该TIMESTAMP
范围在“日期和时间数据类型语法”中描述。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'
,必须正确设置时区表。有关说明,请参见“ MySQL服务器时区支持”。CURDATE()
返回当前日期作为值的形式或格式,具体取决于函数是在字符串环境中还是在数字环境中使用。
'YYYY-MM-DD'
YYYYMMDD
mysql>
SELECT CURDATE(); -> '2008-06-13' mysql>SELECT CURDATE() + 0; -> 20080613CURRENT_DATE
,CURRENT_DATE()
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()
。CURTIME([fsp])
返回当前时间作为值的形式
'hh:mm:ss'
或hhmmss
格式,具体取决于函数是在字符串环境中还是在数字环境中使用。该值以会话时区表示。如果
fsp
给定参数指定从0到6的小数秒精度,则返回值包括该位数的小数秒部分。mysql>
SELECT CURTIME(); -> '23:50:26' mysql>SELECT CURTIME() + 0; -> 235026.000000DATE(expr)
提取日期或日期时间表达式的日期部分
expr
。mysql>
SELECT DATE('2003-12-31 01:02:03'); -> '2003-12-31'DATEDIFF(expr1,expr2)
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'); -> -31DATE_ADD(date,INTERVAL exprunit)
,DATE_SUB(date,INTERVAL exprunit)
这些函数执行日期算术。该
date
参数指定开始日期或日期时间值。expr
是一个表达式,指定要从开始日期添加或减去的间隔值。expr
被评估为字符串;它可能-
以负间隔开始。unit
是一个关键字,指示应解释表达式的单位。有关时间间隔语法的更多信息,包括
unit
说明符的完整列表,expr
每个unit
值的参数的预期形式以及时间算术中操作数解释的规则,请参阅时间间隔。返回值取决于参数:
DATE
如果date
参数是一个DATE
值,你的计算只涉及YEAR
,MONTH
和DAY
部分(即,没有时间部分)。DATETIME
如果第一个参数是一个DATETIME
(或TIMESTAMP
)值,或者如果第一个参数是一个DATE
和unit
值的用途HOURS
,MINUTES
或SECONDS
。- 否则为字符串。
为确保结果正确
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 1SECOND ); -> '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_FORMAT(date,format)
date
根据format
字符串格式化值。下表中显示的说明符可以在
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
系统变量的值控制(“ 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,INTERVAL exprunit)
请参阅的说明
DATE_ADD()
。DAY(date)
DAY()
是的同义词DAYOFMONTH()
。DAYNAME(date)
返回的工作日名称
date
。名称使用的语言由lc_time_names
系统变量的值控制(“ MySQL服务器区域设置支持”)。mysql>
SELECT DAYNAME('2007-02-03'); -> 'Saturday'DAYOFMONTH(date)
传回的月份中的某天,
date
范围1
为到31
,或返回0
日期为零的日期(例如'0000-00-00'
或)'2008-00-00'
。mysql>
SELECT DAYOFMONTH('2007-02-03'); -> 3DAYOFWEEK(date)
返回
date
(1
=周日,2
=星期一,…,7
=周六)的工作日索引。这些索引值对应于ODBC标准。mysql>
SELECT DAYOFWEEK('2007-02-03'); -> 7DAYOFYEAR(date)
返回的日期,
date
范围1
为到366
。mysql>
SELECT DAYOFYEAR('2007-02-03'); -> 34EXTRACT(unit FROM date)
该
EXTRACT()
函数使用与或相同的unit
说明符,但从日期中提取部分而不是执行日期算术。有关自变量的信息,请参见时间间隔。DATE_ADD()
DATE_SUB()
unit
mysql>
SELECT EXTRACT(YEARFROM '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'); -> 123FROM_DAYS(N)
给定天数
N
,返回一个DATE
值。mysql>
SELECT FROM_DAYS(730669); -> '2000-07-03'FROM_DAYS()
旧日期请谨慎使用。它不适用于公历(1582)出现之前的值。请参见“ MySQL使用什么日历?”。FROM_UNIXTIME(unix_timestamp[,format])
返回
unix_timestamp
参数的表示形式,以值或格式表示,取决于函数是在字符串上下文中还是在数字上下文中使用。是一个内部时间戳记值,代表自UTC 以来的秒数,例如由函数产生的时间。'YYYY-MM-DD hh:mm:ss'
YYYYMMDDhhmmss
unix_timestamp
'1970-01-01 00:00:00'
UNIX_TIMESTAMP()
返回值以会话时区表示。(客户端可以按照“ MySQL服务器时区支持”中所述设置会话时区。)
format
如果提供了字符串,则该字符串用于格式化结果的格式与该DATE_FORMAT()
函数条目中所述的相同。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()
功能结合使用时,此功能很有用。第一个和第二个参数的可能值会导致几个可能的格式字符串(有关所使用的
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'HOUR(time)
返回的小时
time
。返回值的范围是0
要23
时间的日值。但是,TIME
值的范围实际上要大得多,因此HOUR
返回的值可以大于23
。mysql>
SELECT HOUR('10:05:03'); -> 10 mysql>SELECT HOUR('272:59:59'); -> 272LAST_DAY(date)
获取日期或日期时间值,并返回当月最后一天的相应值。
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([fsp])
LOCALTIME
并且LOCALTIME()
是同义词NOW()
。LOCALTIMESTAMP
,LOCALTIMESTAMP([fsp])
LOCALTIMESTAMP
并且LOCALTIMESTAMP()
是同义词NOW()
。MAKEDATE(year,dayofyear)
返回给定日期和年份值的日期。
dayofyear
必须大于0或结果为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); -> NULLMAKETIME(hour,minute,second)
返回从计算出的时间值
hour
,minute
和second
参数。该
second
参数可以有小数部分。mysql>
SELECT MAKETIME(12,15,30); -> '12:15:30'MICROSECOND(expr)
从时间或日期时间表达式返回微秒,
expr
范围为从0
到的数字999999
。mysql>
SELECT MICROSECOND('12:00:00.123456'); -> 123456 mysql>SELECT MICROSECOND('2019-12-31 23:59:59.000010'); -> 10MINUTE(time)
返回的分钟
time
,范围0
为59
。mysql>
SELECT MINUTE('2008-02-03 10:05:03'); -> 5MONTH(date)
返回一个月
date
,在范围内1
,以12
供1- 12月,或0
为日期,如'0000-00-00'
或'2008-00-00'
有一个零一个月的一部分。mysql>
SELECT MONTH('2008-02-03'); -> 2MONTHNAME(date)
返回的月份的全名
date
。名称使用的语言由lc_time_names
系统变量的值控制(“ MySQL服务器区域设置支持”)。mysql>
SELECT MONTHNAME('2008-02-03'); -> 'February'NOW([fsp])
返回当前日期和时间作为值的形式或格式,具体取决于该函数是在字符串环境中还是在数字环境中使用。该值以会话时区表示。
'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()
两个功能之间差异的更多信息,请参见说明。PERIOD_ADD(P,N)
将
N
月数添加到句点P
(格式为YYMM
或YYYYMM
)。返回格式为的值YYYYMM
。注意
该时期的说法
P
是没有日期值。mysql>
SELECT PERIOD_ADD(200801,2); -> 200803PERIOD_DIFF(P1,P2)
返回介于
P1
和之间的月数P2
。P1
并且P2
应采用YYMM
或的格式YYYYMM
。注意周期参数P1
和P2
是不是日期值。mysql>
SELECT PERIOD_DIFF(200802,200703); -> 11QUARTER(date)
返回一年的季度
date
,范围1
到4
。mysql>
SELECT QUARTER('2008-04-01'); -> 2SECOND(time)
返回的第二个
time
,范围0
为59
。mysql>
SELECT SECOND('10:05:03'); -> 3SEC_TO_TIME(seconds)
返回
seconds
参数,将其转换为小时,分钟和秒作为TIME
值。结果的范围限制为TIME
数据类型的范围。如果参数对应于该范围之外的值,则会发生警告。mysql>
SELECT SEC_TO_TIME(2378); -> '00:39:38' mysql>SELECT SEC_TO_TIME(2378) + 0; -> 3938STR_TO_DATE(str,format)
这是
DATE_FORMAT()
函数的逆函数。它需要一个字符串str
和一个格式字符串format
。如果格式字符串同时包含日期和时间部分,则STR_TO_DATE()
返回一个DATETIME
值;如果格式字符串仅包含日期或时间部分,则返回一个DATE
或TIME
值。如果从中提取的日期,时间或日期时间值不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'日期部分的范围检查如“ 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
或NO_ZERO_IN_DATE
SQL模式,则不允许零日期或部分日期。在这种情况下,STR_TO_DATE()
返回NULL
并生成警告:mysql>
SET sql_mode = ''; mysql>SELECT STR_TO_DATE('15:35:00', '%H:%i:%s'); +------------------------------------- + | STR_TO_DATE('15:35:00', '%H:%i:%s') | +------------------------------------- + | 15:35:00 | +------------------------------------- + mysql>SET sql_mode = 'NO_ZERO_IN_DATE'; mysql>SELECT STR_TO_DATE('15:35:00', '%h:%i:%s'); +------------------------------------- + | STR_TO_DATE('15:35:00', '%h:%i:%s') | +------------------------------------- + | NULL | +------------------------------------- + mysql>SHOW WARNINGS \G *************************** 1. row *************************** Level : Warning Code : 1411 Message : Incorrect datetime value : '15 :35 :00' for function str_to_date注意
您不能使用格式
"%X%V"
将年-周的字符串转换为日期,因为如果周与月相交,则年和周的组合不能唯一地标识年和月。要将年周转换为日期,还应指定工作日:mysql>
SELECT STR_TO_DATE('200442 Monday', '%X%V %W'); -> '2004-10-18'SUBDATE(date,INTERVAL exprunit)
,SUBDATE(expr,days)
当以
INTERVAL
第二个参数的形式调用时,SUBDATE()
是的同义词DATE_SUB()
。有关自INTERVAL
unit
变量的信息,请参见的讨论DATE_ADD()
。mysql>
SELECT DATE_SUB('2008-01-02',INTERVAL 31 DAY); -> '2007-12-02' mysql>SELECT SUBDATE('2008-01-02',INTERVAL 31 DAY); -> '2007-12-02'第二种形式允许对使用整数值
days
。在这种情况下,它被解释为要从日期或日期时间表达式中减去的天数expr
。mysql>
SELECT SUBDATE('2008-01-02 12:00:00', 31); -> '2007-12-02 12:00:00'SUBTIME(expr1,expr2)
SUBTIME()
返回expr1
-expr2
以与相同格式表示的值expr1
。expr1
是时间或日期时间表达式,并且expr2
是时间表达式。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'SYSDATE([fsp])
返回当前日期和时间作为值的形式或格式,具体取决于该函数是在字符串环境中还是在数字环境中使用。
'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()
还意味着索引不能用于评估引用该索引的表达式。TIME(expr)
提取时间或日期时间表达式的时间部分,
expr
并将其作为字符串返回。此功能对于基于语句的复制不安全。设置为时,如果使用此功能,
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)
TIMEDIFF()
返回expr1
-expr2
以时间值表示。expr1
和expr2
是时间或日期时间表达式,但两者必须为同一类型。返回的结果
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)
仅使用一个参数,此函数将date或datetime表达式
expr
作为datetime值返回。它使用两个参数将时间表达式添加expr2
到日期或日期时间表达式中expr1
,并将结果作为日期时间值返回。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
到date或datetime表达式datetime_expr
。为单元interval
将被给定unit
参数,它应为以下值中的一个:MICROSECOND
(微秒),,SECOND
,MINUTE
,HOUR
,DAY
,WEEK
,MONTH
,QUARTER
或YEAR
。unit
可以使用所示关键字之一或前缀来指定该值SQL_TSI_
。例如,DAY
并且SQL_TSI_DAY
都是合法的。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'TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2)
返回
datetime_expr2
−datetime_expr1
,其中datetime_expr1
和datetime_expr2
是日期或日期时间表达式。一个表达式可以是日期,另一个可以是日期时间。日期值'00:00:00'
在必要时被视为具有时间部分的日期时间。结果的单位(整数)由unit
参数指定。其合法值unit
与TIMESTAMPADD()
功能说明中列出的值相同。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注意
该函数的日期或日期时间参数的顺序
TIMESTAMP()
与使用2个参数调用时与该函数使用的顺序相反。TIME_FORMAT(time,format)
该
DATE_FORMAT()
函数的用法类似于函数,但format
字符串只能包含格式说明符,仅用于小时,分钟,秒和微秒。其他说明符产生一个NULL
值或0
。如果该
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_TO_SEC(time)
返回
time
参数,转换为秒。mysql>
SELECT TIME_TO_SEC('22:23:00'); -> 80580 mysql>SELECT TIME_TO_SEC('00:39:38'); -> 2378TO_DAYS(date)
给定date
date
,返回天数(从0年起的天数)。mysql>
SELECT TO_DAYS(950501); -> 728779 mysql>SELECT TO_DAYS('2007-10-07'); -> 733321TO_DAYS()
不适用于公历(1582)出现之前的值,因为它未考虑更改日历时丢失的日期。对于1582年之前的日期(可能在其他地区可能是较晚的日期),此功能的结果不可靠。请参见“ MySQL使用什么日历?”,以获取详细信息。请记住,MySQL使用“日期和时间数据类型”中的规则将日期中的两位数字年份值转换为四位数形式。例如,
'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 Server模式,这都是正确的。TO_SECONDS(expr)
给定日期或日期时间
expr
,返回自0年以来的秒数。如果expr
不是有效的日期或日期时间值,则返回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年之前的日期(可能在其他地区可能是较晚的日期),此功能的结果不可靠。请参见“ MySQL使用什么日历?”,以获取详细信息。像一样
TO_DAYS()
,TO_SECONDS()
使用“日期和时间数据类型”中的规则将日期中的两位数字年份值转换为四位数形式。在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 Server模式,这都是正确的。UNIX_TIMESTAMP([date])
如果
UNIX_TIMESTAMP()
不带date
参数调用,则返回一个Unix时间戳,表示距'1970-01-01 00:00:00'
UTC的秒数。如果
UNIX_TIMESTAMP()
使用date
参数调用if ,则返回自'1970-01-01 00:00:00'
UTC 以来的秒数形式的参数值。服务器将其解释date
为会话时区中的值,并将其转换为UTC中的内部Unix时间戳值。(客户端可以设置会话时区中描述第5.1.13,“MySQL服务器时区支持”。)该date
参数可以是一个DATE
,DATETIME
或TIMESTAMP
串,或在多个YYMMDD
,YYMMDDhhmmss
,YYYYMMDD
,或者YYYYMMDDhhmmss
格式。如果参数包含时间部分,则可以选择包含小数秒部分。如果未提供任何参数,或者该参数不包括小数秒部分,或者
DECIMAL
如果给出的参数包括小数秒部分,则返回值为整数。当
date
参数为TIMESTAMP
列时,UNIX_TIMESTAMP()
直接返回内部时间戳记值,而不进行隐式的“ string-to-Unix-timestamp ”转换。参数值的有效范围与
TIMESTAMP
数据类型相同:'1970-01-01 00:00:01.000000'
UTC到'2038-01-19 03:14:07.999999'
UTC。如果您将超期日期传递给UNIX_TIMESTAMP()
,它将返回0
。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'
,必须正确设置时区表。有关说明,请参见“ MySQL服务器时区支持”。如果要减去
UNIX_TIMESTAMP()
列,则可能需要将它们强制转换为有符号整数。请参见“信息函数”。UTC_DATE
,UTC_DATE()
返回当前UTC日期作为值的形式或格式,具体取决于该函数是在字符串上下文中使用还是在数字上下文中使用。
'YYYY-MM-DD'
YYYYMMDD
mysql>
SELECT UTC_DATE(), UTC_DATE() + 0; -> '2003-08-14', 20030814UTC_TIME
,UTC_TIME([fsp])
以字符串或数字形式使用该函数,以值
'hh:mm:ss'
或hhmmss
格式返回当前UTC时间。如果
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.000000WEEK(date[,mode])
此函数返回的星期数
date
。两种参数形式的,WEEK()
您可以指定星期是从星期日还是星期一开始,以及返回值应在从0
到53
或从1
到的范围内53
。如果mode
省略该参数,default_week_format
则使用系统变量的值。请参见“服务器系统变量”。下表描述了该
mode
参数的工作方式。模式 一周的第一天 范围 第一周是第一周… 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
具有的意义价值“今年有4个或更多天,” 1988年:周根据ISO 8601编号:- 如果包含1月1日的一周在新年中有4天或更多天,则为第1周。
- 否则,它是上一年的最后一周,下周是第1周。
mysql>
SELECT WEEK('2008-02-20'); -> 7 mysql>SELECT WEEK('2008-02-20',0); -> 7 mysql>SELECT WEEK('2008-02-20',1); -> 8 mysql>SELECT WEEK('2008-12-31',1); -> 53如果日期落入在上周的前一年,MySQL的回报
0
,如果你不使用2
,3
,6
,或7
作为可选的mode
参数:mysql>
SELECT YEAR('2000-01-01'), WEEK('2000-01-01',0); -> 2000, 0可能有人争辩说
WEEK()
应该返回,52
因为给定的日期实际上发生在1999年的第52周。WEEK()
返回0
则是使返回值为“给定年份中的星期数”。”WEEK()
当与从日期中提取日期部分的其他功能结合使用时,可以可靠地使用该功能。如果你喜欢用对于今年评估的结果,其中包含了一周的指定日期,使用的第一天
0
,2
,5
,或7
作为可选mode
参数。mysql>
SELECT WEEK('2000-01-01',2); -> 52或者,使用
YEARWEEK()
函数:mysql>
SELECT YEARWEEK('2000-01-01'); -> 199952 mysql>SELECT MID(YEARWEEK('2000-01-01'),5,2); -> '52'WEEKDAY(date)
返回
date
(0
=星期一,1
=星期二,…6
=星期日)的工作日索引。mysql>
SELECT WEEKDAY('2008-02-03 22:23:00'); -> 6 mysql>SELECT WEEKDAY('2007-11-06'); -> 1WEEKOFYEAR(date)
返回日期的日历周,范围是从
1
到的数字53
。WEEKOFYEAR()
是等效于的兼容性函数。WEEK(date,3)
mysql>
SELECT WEEKOFYEAR('2008-02-20'); -> 8YEAR(date)
返回的一年
date
,在范围1000
至9999
,或0
为“零”日期。mysql>
SELECT YEAR('1987-01-01'); -> 1987YEARWEEK(date)
,YEARWEEK(date,mode)
返回日期的年和周。结果中的年份可能与该年份的第一周和最后一周的date参数中的年份不同。
该
mode
参数的工作原理完全一样的mode
参数WEEK()
。对于单参数语法,使用mode
值0。不像WEEK()
,的值default_week_format
不影响YEARWEEK()
。mysql>
SELECT YEARWEEK('1987-01-01'); -> 198652周数是从什么不同的
WEEK()
函数将返回(0
)的可选参数0
或1
作为WEEK()
然后返回周中的给定年份的情况下。