本节描述可用于操作时态值的函数。看到第11.2节“日期和时间数据类型”,以说明每个日期和时间类型的值范围,以及指定值时可采用的有效格式。
表12.11日期和时间函数
的名字 | 描述 |
---|---|
ADDDATE () |
将时间值(间隔)添加到日期值 |
ADDTIME () |
添加时间 |
CONVERT_TZ () |
从一个时区转换到另一个时区 |
CURDATE () |
返回当前日期 |
当前日期() ,当前日期 |
CURDATE()的同义词 |
当前时间() ,当前时间 |
CURTIME()的同义词 |
CURRENT_TIMESTAMP () ,CURRENT_TIMESTAMP |
NOW的同义词() |
CURTIME () |
返回当前时间 |
日期() |
提取date或datetime表达式的date部分 |
DATE_ADD () |
将时间值(间隔)添加到日期值 |
DATE_FORMAT () |
格式化指定的日期 |
DATE_SUB () |
从日期中减去时间值(间隔) |
DATEDIFF () |
减去两个日期 |
天() |
DAYOFMONTH()的同义词 |
DAYNAME () |
返回工作日的名称 |
DAYOFMONTH () |
返回该月的日期(0-31) |
DAYOFWEEK () |
返回参数的工作日索引 |
DAYOFYEAR () |
返回一年中的某一天(1-366) |
提取() |
摘录部分约会内容 |
FROM_DAYS () |
将日期转换为日期 |
FROM_UNIXTIME () |
将Unix时间戳格式化为日期 |
GET_FORMAT () |
返回一个日期格式字符串 |
小时() |
提取时间 |
LAST_DAY |
返回这个月的最后一天 |
作用是() ,本地时间 |
NOW()的同义词 |
LOCALTIMESTAMP ,LOCALTIMESTAMP () |
NOW()的同义词 |
MAKEDATE () |
根据年份和日期创建一个日期 |
挤出时间() |
以小时、分、秒为单位创造时间 |
微秒() |
返回参数中的微秒数 |
分钟() |
返回参数的分钟 |
月() |
从所经过的日期开始返回月份 |
MONTHNAME () |
返回月份的名称 |
现在() |
返回当前日期和时间 |
PERIOD_ADD () |
在年-月的基础上加上一个周期 |
PERIOD_DIFF () |
返回周期之间的月数 |
季度() |
从date参数返回quarter |
SEC_TO_TIME () |
将秒转换为'hh:mm:ss'格式 |
第二个() |
返回第二个(0-59) |
STR_TO_DATE () |
将字符串转换为日期 |
SUBDATE () |
当使用三个参数调用时,这是DATE_SUB()的同义词 |
SUBTIME () |
减倍 |
SYSDATE () |
返回函数执行的时间 |
时间() |
提取传递的表达式的时间部分 |
TIME_FORMAT () |
格式化为时间 |
TIME_TO_SEC () |
返回转换为秒的参数 |
TIMEDIFF () |
减去时间 |
时间戳() |
如果只有一个参数,此函数将返回date或datetime表达式;有两个参数,参数的和 |
TIMESTAMPADD () |
向datetime表达式添加一个间隔 |
TIMESTAMPDIFF () |
从datetime表达式中减去一个间隔 |
TO_DAYS () |
返回转换为天数的date参数 |
TO_SECONDS () |
返回date或datetime参数转换为从Year 0开始的秒数 |
UNIX_TIMESTAMP () |
返回Unix时间戳 |
UTC_DATE () |
返回当前UTC日期 |
UTC_TIME () |
返回当前UTC时间 |
UTC_TIMESTAMP () |
返回当前UTC日期和时间 |
周() |
返回周号 |
工作日() |
返回工作日索引 |
WEEKOFYEAR () |
返回日期的日历周(1-53) |
年() |
回归一年 |
YEARWEEK () |
返回年份和星期 |
下面是一个使用日期函数的例子。下面的查询选择具有date_col
过去30天内的价值:
mysql >选择某物从tbl_name-> where date_sub (curdate (), interval 30天)<=date_col;
查询还会选择日期在将来的行。
期望日期值的函数通常接受datetime值,而忽略时间部分。期望得到时间值的函数通常接受datetime值,而忽略date部分。
每个返回当前日期或时间的函数在查询执行开始时只计算一次。这意味着对一个函数的多次引用,例如现在()
在单个查询中总是产生相同的结果。(就我们的目的而言,单个查询还包括对存储程序(存储例程、触发器或事件)和该程序调用的所有子程序的调用。)这个原则也适用于CURDATE ()
,CURTIME ()
,UTC_DATE ()
,UTC_TIME ()
,UTC_TIMESTAMP ()
,以及他们的任何同义词。
的CURRENT_TIMESTAMP ()
,当前时间()
,当前日期()
,FROM_UNIXTIME ()
函数返回当前会话时区中的值,该值可作为time_zone
系统变量。此外,UNIX_TIMESTAMP ()
假设它的参数是会话时区中的datetime值。看到“MySQL服务器时区支持”章节5.1.15.
可以使用一些日期函数”零”日期或不完整的日期,例如“2001-11-00”
,而其他人则不能。提取日期部分的函数通常处理不完整的日期,因此可能在您期望得到非零值时返回0。例如:
mysql> SELECT DAYOFMONTH('2001-11-00'), MONTH(' 2005-06-00 ');-> 0,0
其他函数期望完成日期和返回零
对于不完整的日期。这些函数包括执行日期算术或将日期的部分映射到名称的函数。例如:
mysql> SELECT DATE_ADD('2006-05-00',间隔1天);—> NULL mysql> SELECT DAYNAME('2006-05-00');- >零
传递时,有几个函数是严格的日期()
函数value作为参数并拒绝day部分为零的不完整日期:CONVERT_TZ ()
,DATE_ADD ()
,DATE_SUB ()
,DAYOFYEAR ()
,TIMESTAMPDIFF ()
,TO_DAYS ()
,TO_SECONDS ()
,周()
,工作日()
,WEEKOFYEAR ()
,YEARWEEK ()
.
小数秒时间
,DATETIME
,时间戳
支持值,精度可达微秒。接受临时实参的函数接受的值为小数秒。时间函数的返回值适当地包括小数秒。
ADDDATE (
,日期
,间隔expr
单位
)ADDDATE (
expr
,天
)的方法调用时
时间间隔
第二个论证的形式,ADDDATE ()
是的同义词吗DATE_ADD ()
.相关功能SUBDATE ()
是的同义词吗DATE_SUB ()
.有关时间间隔
单位
论点,看到时间间隔.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”
ADDTIME ()
增加了expr2
来expr1
并返回结果。expr1
是time或datetime表达式,和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 ()
转换datetime值dt
从给定的时区from_tz
到给定的时区to_tz
并返回结果值。时区的指定请参见“MySQL服务器时区支持”章节5.1.15.这个函数返回零
如果参数无效。参数支持的范围之外
时间戳
类型时从from_tz
到UTC时,不会发生转换。的时间戳
范围描述于第11.2.1节“日期和时间数据类型语法”.mysql> SELECT CONVERT_TZ('2004-01-01 12:00:00','GMT','MET');——>“2004-01-01 13:00:00”mysql >选择CONVERT_TZ(' 2004-01-01 12:00:00 ', ' + 0 ', ' + 10”);-> '2004-01-01 22:00:00'
请注意要使用命名的时区,例如
“见过”
或欧洲/阿姆斯特丹的
时,必须正确设置时区表。有关说明,请参见“MySQL服务器时区支持”章节5.1.15.中的值返回当前日期
'
或YYYY-MM-DD
'名称
格式,取决于函数是在字符串还是数字上下文中使用。SELECT CURDATE();查询mysql> '2008-06-13' SELECT CURDATE() + 0;- > 20080613
当前日期
而且当前日期()
都是同义词CURDATE ()
.当前时间
而且当前时间()
都是同义词CURTIME ()
.CURRENT_TIMESTAMP
,CURRENT_TIMESTAMP ([
fsp
])中的值返回当前时间
“hh: mm: ss”
或hhmmss
格式,取决于函数是在字符串还是数字上下文中使用。取值为会话所在的时区。如果
fsp
参数指定从0到6的小数秒精度,则返回值包括该多位数中的小数秒部分。SELECT CURTIME();-> '23:50:26' mysql> SELECT CURTIME() + 0;- > 235026.000000
提取date或datetime表达式的日期部分
expr
.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
DATE_ADD (
,日期
,间隔expr
单位
)DATE_SUB (
日期
,间隔expr
单位
)这些函数执行日期算术。的
日期
参数指定开始日期或datetime值。expr
指定要从开始日期加减的间隔值的表达式。expr
作为字符串计算;它可能从a开始-
对于负区间。单位
是指示应在其中解释表达式的单元的关键字。有关时间间隔语法的更多信息,包括的完整列表
单位
的期望形式expr
每个的参数单位
值和用于时态算术中操作数解释的规则,请参见时间间隔.返回值取决于参数:
以确保结果是
DATETIME
,你可以使用把()
将第一个参数转换为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);-> ' 21-01-01 00:00:00' mysql> SELECT DATE_ADD('2018-12-31 23:59:59', -> INTERVAL 1 DAY);-> ' 19-01-01 23:59:59' mysql> SELECT DATE_ADD(' 21-12-31 23:59:59', -> INTERVAL '1:1' MINUTE_SECOND);-> '2101-01-01 00:01:00' mysql> SELECT DATE_SUB(' 25-01-01 00:00:00', -> INTERVAL '1 1:1:1' DAY_SECOND);-> ' 24-12-30 22:58:59' mysql> SELECT DATE_ADD('1900-01-01 00:00:00', -> INTERVAL '-1 10' DAY_HOUR);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'
格式的
日期
根据格式
字符串。下表所示的规格可用于
格式
字符串。的%
在格式说明符字符之前需要字符。说明符也适用于其他函数:STR_TO_DATE ()
,TIME_FORMAT ()
,UNIX_TIMESTAMP ()
.说明符 描述 %的
工作日名称的缩写( 太阳
..坐
)% b
月名的缩写( 1月
..12月
)% c
月,数字( 0
..12
)% D
有英文后缀( 第0
,1日
,2日
,3日
,……)% d
日期,数字( 00
..31
)% e
日期,数字( 0
..31
)% f
微秒( 000000
..999999
)% H
小时( 00
..23
)% h
小时( 01
..12
)%我
小时( 01
..12
)%我
分钟,数字( 00
..59
)% j
年月日( 001
..366
)% k
小时( 0
..23
)% l
小时( 1
..12
)% M
月份名称( 1月
..12月
)% m
月,数字( 00
..12
)% p
我
或点
r %
时间,12小时( hh: mm: ss
紧随其后的是我
或点
)% S
秒( 00
..59
)% s
秒( 00
..59
)% T
时间,24小时( hh: mm: ss
)% U
周( 00
..53
),其中星期日为一周的第一天;周()
模式0% u
周( 00
..53
),其中星期一为一星期的第一天;周()
模式1% V
周( 01
..53
),其中星期日为一周的第一天;周()
模式2;使用% X
% v
周( 01
..53
),其中星期一为一星期的第一天;周()
模式3;使用% x
% W
工作日名称( 周日
..周六
)% w
星期几( 0
星期天= . .6
=周六)% X
年份,表示星期天是一周第一天的那一周,数字,四位数字;使用 % V
% x
年份表示星期,星期一是一周的第一天,数字,四位数字;使用 % v
Y %
年份,数字,四位数 y %
年份,数字(两位数字) % %
一个文字 %
字符%
x
x
,任何”x
”以上未列月和日说明符的范围以零开始,这是因为MySQL允许存储不完整的日期,例如
“2014-00-00”
.的值控制日和月名称和缩写所使用的语言
lc_time_names
系统变量(第10.16节,“MySQL服务器地区支持”).为
% U
,% u
,% V
,% v
说明符,请参见说明周()
函数获取有关模式值的信息。模式影响星期编号的发生方式。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 >选择DATE_FORMAT(“1900-10-04 22:23:00”- >“y % D % % % 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_ADD ()
.天()
是的同义词吗DAYOFMONTH ()
.返回的工作日的名称
日期
.类的值控制名称使用的语言lc_time_names
系统变量(第10.16节,“MySQL服务器地区支持”).mysql> SELECT DAYNAME('2007-02-03');——>“星期六”
返回一个月的哪一天
日期
,在范围内1
来31
,或0
对于日期,如“0000-00-00”
或“2008-00-00”
有零日部分。mysql> SELECT DAYOFMONTH('2007-02-03');- > 3
返回的工作日索引
日期
(1
星期天=,2
=星期一,……7
=周六)。这些索引值与ODBC标准相对应。mysql> SELECT DAYOFWEEK('2007-02-03');- > 7
返回一年的日子为
日期
,在范围内1
来366
.mysql> SELECT DAYOFYEAR('2007-02-03');- > 34
的
提取()
函数使用相同的类型单位
说明符,DATE_ADD ()
或DATE_SUB ()
,但从日期中提取部分,而不是执行日期算术。有关单位
论点,看到时间间隔.SELECT SELECT (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 (MICROSECOND -> FROM '2003-01-02 10:30:00.000123');- > 123
给定一个天数
N
,返回一个日期
价值。SELECT FROM_DAYS(730669);——>“2000-07-03”
使用
FROM_DAYS ()
对旧的约会要小心。它不用于格列高利历(1582年)出现之前的值。看到第12.9节,“MySQL使用什么日历?”.FROM_UNIXTIME (
unix_timestamp
(,格式
])对象的表示形式
unix_timestamp
参数中的值'
或YYYY-MM-DD hh: mm: ss
'YYYYMMDDhhmmss
格式,取决于函数是在字符串上下文中使用还是在数值上下文中使用。unix_timestamp
内部时间戳值是否表示时间间隔“1970-01-01”就是
UTC,如产生的UNIX_TIMESTAMP ()
函数。返回值以会话时区表示。(客户端可以按照“MySQL服务器时区支持”章节5.1.15)。的
格式
字符串,如果给定,则使用与项中描述的相同的方式格式化结果DATE_FORMAT ()
函数。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年11月13日10:08:01 2015'
请注意如果你使用
UNIX_TIMESTAMP ()
而且FROM_UNIXTIME ()
如果要在非utc时区的值和Unix时间戳值之间进行转换,则转换是有损的,因为映射在两个方向上都不是一对一的。详细信息请参见UNIX_TIMESTAMP ()
函数。GET_FORMAT({日期时间| | DATETIME},{“欧元”|“美国”|“JIS”|“ISO”|“内部”})
返回一个格式字符串。的组合使用时,此函数非常有用
DATE_FORMAT ()
和STR_TO_DATE ()
功能。第一个和第二个参数的可能值会导致几个可能的格式字符串(有关所使用的说明符,请参阅
DATE_FORMAT ()
功能描述)。ISO格式是指ISO 9075,而不是ISO 8601。函数调用 结果 GET_FORMAT(日期、“美国”)
' % m % d % Y '
GET_FORMAT(日期、JIS)
' % Y - % - % d '
GET_FORMAT(日期、“ISO”)
' % Y - % - % d '
GET_FORMAT(日期、“欧元”)
' % d % m % Y '
GET_FORMAT(日期、“内部”)
' % Y % m % d '
GET_FORMAT (DATETIME,“美国”)
' % Y - % - % d % h . %: % s的
GET_FORMAT (DATETIME, JIS)
' % Y - % - % d % H: %我:% s的
GET_FORMAT (DATETIME,“ISO”)
' % Y - % - % d % H: %我:% s的
GET_FORMAT (DATETIME,“欧元”)
' % Y - % - % d % h . %: % s的
GET_FORMAT (DATETIME,“内部”)
' % Y % m % d % H % % s的
GET_FORMAT(时间、“美国”)
”我% h: %: % s % p '
GET_FORMAT(时间、JIS)
“我% H: %: % s”
GET_FORMAT(时间、“ISO”)
“我% H: %: % s”
GET_FORMAT(时间、“欧元”)
“% h . %: % s”
GET_FORMAT(时间、“内部”)
“我% H % % s”
时间戳
也可以用作第一个参数GET_FORMAT ()
,在这种情况下,函数返回与for相同的值DATETIME
.mysql> SELECT DATE_FORMAT('2003-10-03',GET_FORMAT(DATE,'EUR'));mysql> SELECT STR_TO_DATE('10.31.2003',GET_FORMAT(DATE,'USA'));——>“2003-10-31”
返回时间
时间
.返回值的范围是0
来23
对于一天中的时间值。然而,的范围时间
value实际上要大得多,所以小时
返回值是否可以大于23
.mysql> SELECT HOUR('10:05:03');SELECT HOUR('272:59:59');- > 272
获取date或datetime值,并返回当月最后一天的对应值。返回
零
如果参数无效。mysql> SELECT LAST_DAY('2003-02-05');——mysql> '2003-02-28' SELECT LAST_DAY('2004-02-05');—> '2004-02-29' mysql> SELECT LAST_DAY('2004-01-01 01:01:01');mysql> '2004-01-31' SELECT LAST_DAY('2003-03-32');- >零
LOCALTIMESTAMP
,LOCALTIMESTAMP ([
fsp
])返回给定年份和日期值的日期。
dayofyear
必须大于0还是结果是零
.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);- >零
方法计算的时间值
小时
,一分钟
,第二个
参数。的
第二个
Argument可以有小数部分。mysql> SELECT MAKETIME(12,15,30);- - - - - - >“12:15:30
从time或datetime表达式返回微秒数
expr
范围内的数字0
来999999
.mysql> SELECT MICROSECOND('12:00:00.123456');-> 123456 mysql> SELECT MICROSECOND('2019-12-31 23:59:59.000010');- > 10
返回…的分钟
时间
,在范围内0
来59
.mysql> SELECT MINUTE('2008-02-03 10:05:03');- > 5
返回的月份
日期
,在范围内1
来12
一月至十二月,或0
对于日期,如“0000-00-00”
或“2008-00-00”
有0个月的部分。mysql> SELECT MONTH('2008-02-03');- > 2
返回月份的全名
日期
.类的值控制名称使用的语言lc_time_names
系统变量(第10.16节,“MySQL服务器地区支持”).SELECT MONTHNAME('2008-02-03');——>“2”
中的值返回当前日期和时间
'
或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
现在()
返回一个常量时间,该时间指示语句开始执行的时间。(在存储函数或触发器中,现在()
返回函数或触发语句开始执行的时间。)这与for的行为不同SYSDATE ()
,它返回执行的确切时间。mysql> SELECT NOW(), SLEEP(2), NOW();+---------------------+----------+---------------------+ | ()(2) | |睡眠现在 () | +---------------------+----------+---------------------+ | 2006-04-12 13:47:36 | 0 | 2006-04-12 13:47:36 | +---------------------+----------+---------------------+ mysql >选择SYSDATE(),(2)睡觉,SYSDATE ();+---------------------+----------+---------------------+ | SYSDATE()(2) | |睡眠SYSDATE () | +---------------------+----------+---------------------+ | 2006-04-12 13:47:44 | 0 | 2006-04-12 13:47:46 | +---------------------+----------+---------------------+
此外,
设置时间戳
语句将影响返回的值现在()
但不是通过SYSDATE ()
.这意味着二进制日志中的时间戳设置对调用没有影响SYSDATE ()
.将时间戳设置为非零值将导致后续的每次调用现在()
返回该值。将时间戳设置为零可以取消这种效果,因此现在()
再次返回当前日期和时间。参见描述
SYSDATE ()
有关这两个函数之间差异的更多信息。增加了
N
月至期间P
(格式为YYMM
或YYYYMM
).返回格式的值YYYYMM
.请注意关于周期的论证
P
是不日期值。mysql> SELECT PERIOD_ADD(200801,2);- > 200803
返回周期之间的月数
P1
而且P2
.P1
而且P2
应该在格式中YYMM
或YYYYMM
.注意period参数P1
而且P2
是不日期值。SELECT PERIOD_DIFF(200802,200703);- > 11
返回的一年的季度
日期
,在范围内1
来4
.mysql> SELECT QUARTER('2008-04-01');- > 2
返回第二个
时间
,在范围内0
来59
.SELECT SECOND('10:05:03');- > 3
返回
秒
参数,转换为小时,分钟和秒,作为时间
价值。结果的范围被限制在时间
数据类型。如果实参对应于该范围之外的值,则会出现警告。SELECT SEC_TO_TIME(2378);- mysql> '00:39:38' SELECT SEC_TO_TIME(2378) + 0;- > 3938
这是的倒数
DATE_FORMAT ()
函数。它需要一个字符串str
格式字符串格式
.STR_TO_DATE ()
返回一个DATETIME
值,如果格式字符串同时包含日期和时间部分日期
或时间
值,如果字符串只包含日期或时间部分。中提取的日期、时间或datetime值str
是非法的,STR_TO_DATE ()
返回零
并产生一个警告。服务器扫描
str
试图匹配格式
到它。格式字符串可以包含文字字符和以%
.中的文字字符格式
必须匹配字面上的str
.格式说明符格式
必须匹配日期或时间部分str
.中可以使用的说明符格式
,请参阅DATE_FORMAT ()
功能描述。mysql >选择STR_TO_DATE (01, 2013, ' % d % m % Y ');——>“2013-05-01”mysql >选择STR_TO_DATE(2013年5月1日,' Y % M % d % ');——>“2013-05-01”
的开始开始扫描
str
如果失败了格式
发现不匹配。末尾的额外字符str
将被忽略。mysql >选择STR_TO_DATE(“a09:30:17”、“h %: %我:% s ');——>“09:30:17”mysql >选择STR_TO_DATE(“a09:30:17”,“我% h: %: % s”);零mysql - > >选择STR_TO_DATE(“09:30:17a”,“我% h: %: % s”);——>“09:30:17”
未指定的日期或时间部分的值为0,因此不完全指定的值
str
产生一个部分或全部部分设置为0的结果:SELECT STR_TO_DATE('abc','abc');——>“0000-00-00”mysql >选择STR_TO_DATE (' 9 ', ' % m ');——>“0000-09-00”mysql >选择STR_TO_DATE (' 9 ', ' % s ');——>“00:00:09”
日期值部分的范围检查如中所述第11.2.2节“DATE, DATETIME和TIMESTAMP类型”.例如,这意味着”零”允许部分值为0的日期或日期,除非SQL模式设置为不允许这样的值。
mysql >选择STR_TO_DATE (' 00/00/0000 ', ' % m / % d / Y % ');——>“0000-00-00”mysql >选择STR_TO_DATE(‘04/31/2004’,‘% m / % d / Y % ');——>“2004-04-31”
如果
NO_ZERO_DATE
启用SQL模式,不允许零日期。在这种情况下,STR_TO_DATE ()
返回零
并生成一个警告:设置sql_mode = ";mysql >选择STR_TO_DATE (' 00/00/0000 ', ' % m / % d / Y % ');+---------------------------------------+ | STR_TO_DATE(“00/00/0000”、“% m / % d / Y % ') | +---------------------------------------+ | 0000-00-00 | +---------------------------------------+ mysql >设置sql_mode =“NO_ZERO_DATE”;mysql >选择STR_TO_DATE (' 00/00/0000 ', ' % m / % d / Y % ');+---------------------------------------+ | STR_TO_DATE(“00/00/0000”、“% m / % d / Y % ') | +---------------------------------------+ | 零 | +---------------------------------------+ mysql > \ G显示警告 *************************** 1。行***************************级别:警告代码:1411消息:错误的日期时间值:'00/00/0000'用于函数str_to_date
请注意不能使用格式
“% X % V”
将年-周字符串转换为日期,因为如果周跨越了月的边界,年和周的组合就不能唯一标识年和月。要将年-周转换为日期,还应该指定工作日:mysql> SELECT STR_TO_DATE('200442 Monday', '%X%V %W');——>“2004-10-18”
SUBDATE (
,日期
,间隔expr
单位
)SUBDATE (
expr
,天
)的方法调用时
时间间隔
第二个论证的形式,SUBDATE ()
是的同义词吗DATE_SUB ()
.有关时间间隔
单位
论点,见讨论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”
第二种形式允许使用整数值
天
.在这种情况下,它被解释为要从date或datetime表达式中减去的天数expr
.mysql> SELECT SUBDATE('2008-01-02 12:00:00', 31);-> '2007-12-02 12:00:00'
SUBTIME ()
返回expr1
−expr2
表示为与。格式相同的值expr1
.expr1
是time或datetime表达式,和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”
中的值返回当前日期和时间
'
或YYYY-MM-DD hh: mm: ss
'YYYYMMDDhhmmss
格式,取决于函数是在字符串还是数字上下文中使用。如果
fsp
参数指定从0到6的小数秒精度,则返回值包括该多位数中的小数秒部分。SYSDATE ()
返回它执行的时间。这与for的行为不同现在()
,它返回一个常量时间,指示语句开始执行的时间。(在存储函数或触发器中,现在()
返回函数或触发语句开始执行的时间。)mysql> SELECT NOW(), SLEEP(2), NOW();+---------------------+----------+---------------------+ | ()(2) | |睡眠现在 () | +---------------------+----------+---------------------+ | 2006-04-12 13:47:36 | 0 | 2006-04-12 13:47:36 | +---------------------+----------+---------------------+ mysql >选择SYSDATE(),(2)睡觉,SYSDATE ();+---------------------+----------+---------------------+ | SYSDATE()(2) | |睡眠SYSDATE () | +---------------------+----------+---------------------+ | 2006-04-12 13:47:44 | 0 | 2006-04-12 13:47:46 | +---------------------+----------+---------------------+
此外,
设置时间戳
语句将影响返回的值现在()
但不是通过SYSDATE ()
.这意味着二进制日志中的时间戳设置对调用没有影响SYSDATE ()
.因为
SYSDATE ()
是否可以在同一语句中返回不同的值,而不受设置时间戳
,如果使用基于语句的二进制日志记录,它是不确定的,因此对于复制不安全。如果这是个问题,您可以使用基于行的日志记录。或者,您也可以使用
——sysdate-is-now
引起的选项SYSDATE ()
作…的别名现在()
.如果在复制源服务器和副本上都使用该选项,则此操作有效。的不确定性
SYSDATE ()
也意味着索引不能用于对引用它的表达式求值。提取时间或日期时间表达式的时间部分
expr
并以字符串的形式返回。此函数对于基于语句的复制是不安全的。当您使用此函数时,将记录一个警告
binlog_format
设置为声明
.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
是时间或日期和时间表达式,但两者必须具有相同的类型。返回的结果
TIMEDIFF ()
是否限制在允许的范围内时间
值。或者,您也可以使用这两个函数中的任何一个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”
如果只有一个参数,此函数将返回date或datetime表达式
expr
作为一个日期时间值。通过两个参数,它添加了时间表达式expr2
到date或datetime表达式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 (
单位
,时间间隔
,datetime_expr
)添加整数表达式。
时间间隔
到date或datetime表达式datetime_expr
.单位为时间间隔
由单位
参数,它应该是以下值之一:微秒
(微秒),第二个
,一分钟
,小时
,一天
,周
,月
,季度
,或一年
.的
单位
值可以使用如下所示的关键字之一指定,也可以使用前缀指定SQL_TSI_
.例如,一天
而且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 (
单位
,datetime_expr1
,datetime_expr2
)返回
datetime_expr2
−datetime_expr1
,在那里datetime_expr1
而且datetime_expr2
是date或datetime表达式。一个表达式可能是一个日期,另一个是一个日期时间;日期值被视为具有时间部分的日期时间“就是”
必要的地方。函数给出结果的单位(整数)单位
论点。的法律价值单位
是否与描述中列出的相同TIMESTAMPADD ()
函数。SELECT TIMESTAMPDIFF(MONTH,'2003-02-01','2003-05-01');SELECT TIMESTAMPDIFF('2002-05-01','2001-01-01');SELECT TIMESTAMPDIFF(MINUTE,'2003-02-01','2003-05-01 12:05:55');- > 128885
请注意函数的date或datetime参数的顺序与
时间戳()
函数调用时使用两个参数。这就像the
DATE_FORMAT ()
功能,但格式
字符串只能包含小时、分钟、秒和微秒的格式说明符。其他指示符产生零
值或0
.如果
时间
值包含大于的小时部分23
,% H
而且% k
小时格式说明符产生的值大于通常的范围0 . . 23
.其他的小时格式说明符生成以12为模的小时值。mysql> SELECT TIME_FORMAT('100:00:00', '%H %k %H %I %l');-> '100 100 04 04 4'
返回
时间
参数,转换为秒。SELECT TIME_TO_SEC('22:23:00');-> 80580 mysql> SELECT TIME_TO_SEC('00:39:38');- > 2378
给定一个日期
日期
,返回一个日数(自0年以来的天数)。SELECT TO_DAYS(950501);SELECT TO_DAYS('2007-10-07');- > 733321
TO_DAYS ()
不打算与格列高利历(1582)出现之前的值一起使用,因为它没有考虑到日历更改时丢失的天数。对于1582年以前的日期(在其他地区可能是更晚的一年),这个函数的结果是不可靠的。看到第12.9节,“MySQL使用什么日历?”,以了解详情。记住,MySQL使用中的规则将日期中的两位数年份值转换为四位数形式第11.2节“日期和时间数据类型”.例如,
“2008-10-07”
而且“08-10-07”
被视为相同的日期:SELECT TO_DAYS('08-10-07'), TO_DAYS('08-10-07');-> 733687, 733687
在MySQL中,零日期定义为
“0000-00-00”
,即使该日期本身被认为是无效的。这意味着,对于“0000-00-00”
而且“0000-01-01”
,TO_DAYS ()
返回这里显示的值:SELECT TO_DAYS('0000-00-00');+-----------------------+ | to_days (' 0000-00-00 ') | +-----------------------+ | 零 | +-----------------------+ 1行集,警告(0.00秒)mysql >显示警告;+---------+------+----------------------------------------+ | 水平| |消息代码 | +---------+------+----------------------------------------+ | 警告| 1292 |错误的datetime值:0000-00-00 ' | +---------+------+----------------------------------------+ 1行组(0.00秒)mysql >选择TO_DAYS (' 0000-01-01 ');+-----------------------+ | to_days (' 0000-01-01 ') | +-----------------------+ | 1 | +-----------------------+ 1行集(0.00秒)
这是正确的,无论是否
ALLOW_INVALID_DATES
已启用SQL server模式。给定日期或日期时间
expr
,返回自0年以来的秒数。如果expr
不是有效的日期或日期时间值,返回零
.SELECT TO_SECONDS(950501);mysql> SELECT TO_SECONDS('2009-11-29');mysql> SELECT TO_SECONDS('2009-11-29 13:43:32');-> 63426721412 mysql> SELECT TO_SECONDS(NOW());- > 63426721458
就像
TO_DAYS ()
,TO_SECONDS ()
不打算与格列高利历(1582)出现之前的值一起使用,因为它没有考虑到日历更改时丢失的天数。对于1582年以前的日期(在其他地区可能是更晚的一年),这个函数的结果是不可靠的。看到第12.9节,“MySQL使用什么日历?”,以了解详情。就像
TO_DAYS ()
,TO_SECONDS ()
中的规则将日期中的两位数年份值转换为四位数形式第11.2节“日期和时间数据类型”.在MySQL中,零日期定义为
“0000-00-00”
,即使该日期本身被认为是无效的。这意味着,对于“0000-00-00”
而且“0000-01-01”
,TO_SECONDS ()
返回这里显示的值:SELECT TO_SECONDS('0000-00-00');+--------------------------+ | TO_SECONDS (' 0000-00-00 ') | +--------------------------+ | 零 | +--------------------------+ 1行集,警告(0.00秒)mysql >显示警告;+---------+------+----------------------------------------+ | 水平| |消息代码 | +---------+------+----------------------------------------+ | 警告| 1292 |错误的datetime值:0000-00-00 ' | +---------+------+----------------------------------------+ 1行组(0.00秒)mysql >选择TO_SECONDS (' 0000-01-01 ');+--------------------------+ | TO_SECONDS (' 0000-01-01 ') | +--------------------------+ | 86400年 | +--------------------------+ 1行集(0.00秒)
这是正确的,无论是否
ALLOW_INVALID_DATES
已启用SQL server模式。如果
UNIX_TIMESTAMP ()
被称为没有日期
参数,它返回一个表示时间间隔的Unix时间戳“1970-01-01”就是
UTC。如果
UNIX_TIMESTAMP ()
被称为日期
参数,它将返回参数的值作为秒since“1970-01-01”就是
UTC。服务器解释日期
作为会话时区的值,并将其转换为UTC的内部Unix时间戳值。(客户端可以按照“MySQL服务器时区支持”章节5.1.15)。的日期
论证可能是日期
,DATETIME
,或时间戳
字符串,或数字YYMMDD
,YYMMDDhhmmss
,名称
,或YYYYMMDDhhmmss
格式。如果参数包含时间部分,则可以选择包含小数秒部分。如果没有给出参数或参数不包括小数秒部分,则返回值为整数
小数
如果给出的参数包含小数秒部分。当
日期
论证是一个时间戳
列,UNIX_TIMESTAMP ()
直接返回内部时间戳值,没有隐式”string-to-Unix-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 ()
将该值映射回仅一个原始值。下面是一个示例,使用不同的值见过
时区:SET time_zone = 'MET';mysql> SELECT UNIX_TIMESTAMP('2005-03-27 03:00:00');+---------------------------------------+ | UNIX_TIMESTAMP (' 2005-03-27 03:00:00 ') | +---------------------------------------+ | 1111885200 | +---------------------------------------+ mysql >选择UNIX_TIMESTAMP(“2005-03-27 02:00:00”);+---------------------------------------+ | UNIX_TIMESTAMP (' 2005-03-27 02:00:00 ') | +---------------------------------------+ | 1111885200 | +---------------------------------------+ mysql >选择FROM_UNIXTIME (1111885200);+---------------------------+ | FROM_UNIXTIME (1111885200 ) | +---------------------------+ | 2005-03-27 03:00:00 | +---------------------------+
请注意要使用命名的时区,例如
“见过”
或欧洲/阿姆斯特丹的
时,必须正确设置时区表。有关说明,请参见“MySQL服务器时区支持”章节5.1.15.如果你想做减法
UNIX_TIMESTAMP ()
列,您可能需要将它们转换为有符号整数。看到第12.11节“强制转换函数和运算符”.中的值返回当前UTC日期
'
或YYYY-MM-DD
'名称
格式,取决于函数是在字符串还是数字上下文中使用。SELECT UTC_DATE(), UTC_DATE() + 0;-> '2003-08-14', 20030814
中的值返回当前UTC时间
“hh: mm: ss”
或hhmmss
格式,取决于函数是在字符串还是数字上下文中使用。如果
fsp
参数指定从0到6的小数秒精度,则返回值包括该多位数中的小数秒部分。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的小数秒精度,则返回值包括该多位数中的小数秒部分。SELECT UTC_TIMESTAMP(), UTC_TIMESTAMP() + 0;-> '2003-08-14 18:08:04', 20030814180804.000000
的周号
日期
.的双参数形式周()
使您能够指定一周是从周日开始还是从周一开始,以及返回值是否应该在的范围内0
来53
或从1
来53
.如果模式
参数的值将被省略default_week_format
使用系统变量。看到第5.1.8节,“服务器系统变量”.下表描述了如何
模式
论证工作。模式 每周第一天 范围 第一周是第一周…… 0 周日 0-53 今年只有一个星期天 1 周一 0-53 今年有4天以上 2 周日 —53 今年只有一个星期天 3. 周一 —53 今年有4天以上 4 周日 0-53 今年有4天以上 5 周一 0-53 今年有一个星期一 6 周日 —53 今年有4天以上 7 周一 —53 今年有一个星期一 为
模式
的意义的值”今年如果有4天以上,”周的编号根据ISO 8601:1988:如果包含1月1日的一周在新的一年中有4天或4天以上,它是第1周。
否则,它是前一年的最后一周,下一周是第一周。
mysql> SELECT WEEK('2008-02-20');SELECT WEEK('2008-02-20',0);SELECT WEEK('2008-02-20',1);mysql> SELECT WEEK('2008-12-31',1);- > 53
如果日期落在前一年的最后一周,MySQL将返回
0
如果不使用2
,3.
,6
,或7
作为可选选项模式
论点:mysql> SELECT YEAR('2000-01-01'), WEEK('2000-01-01',0);-> 2000, 0
有人可能会说
周()
应该返回52
因为给定的日期实际上发生在1999年的第52周。周()
返回0
因此返回值为”周:给定年份的周数”这就利用了周()
当与从日期中提取日期部分的其他函数结合使用时,函数是可靠的。如果您希望得到一个关于年份的结果,其中包含给定日期的一周的第一天,请使用
0
,2
,5
,或7
作为可选选项模式
论点。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”
返回的工作日索引
日期
(0
=周一,1
=星期二,……6
=周日)。mysql> SELECT WEEKDAY('2008-02-03 22:23:00');mysql> SELECT WEEKDAY('2007-11-06');- > 1
返回日期的日历周,作为范围中的数字
1
来53
.WEEKOFYEAR ()
相容性函数等价于周(
.日期
,3)mysql> SELECT WEEKOFYEAR('2008-02-20');- > 8
年的回报
日期
,在范围内1000
来9999
,或0
为”零”日期。mysql> SELECT YEAR('1987-01-01');- > 1987
YEARWEEK (
,日期
)YEARWEEK (
日期
,模式
)返回年份和星期的日期。对于一年的第一周和最后一周,结果中的年份可能不同于日期参数中的年份。
的
模式
参数的工作原理和模式
参数周()
.对于单参数语法,a模式
使用0值。不像周()
的价值。default_week_format
不影响YEARWEEK ()
.mysql> SELECT YEARWEEK('1987-01-01');- > 198652