日期和时间值可以用几种格式表示,例如带引号的字符串或数字,这取决于值的确切类型和其他因素。例如,在MySQL期望日期的上下文中,它解释任何“2015-07-21”
,“20150721”
,20150721
作为一个日期。
本节描述日期和时间文本的可接受格式。有关时态数据类型的更多信息,例如允许值的范围,请参见第11.2节,“日期和时间数据类型”.
标准SQL和ODBC日期和时间文字。标准SQL要求使用类型关键字和字符串指定时间字面值。关键字和字符串之间的空格是可选的。
日期的str“时间”str“时间戳”str'
MySQL可以识别,但与标准SQL不同,它不需要type关键字。符合标准的应用程序应该包含用于时态文字的type关键字。
MySQL也能识别ODBC语法对应于标准SQL语法:
{d 'str'} {t 'str'} {ts 'str'}
MySQL使用type关键字和ODBC构造来生成日期
,时间
,DATETIME
值,如果指定,则包括尾随的小数秒部分。的时间戳
语法生成一个DATETIME
值,因为DATETIME
有一个更接近于标准SQL的范围时间戳
类型,其年份范围从0001
来9999
.(MySQL时间戳
年的范围是1970
来2038
.)
日期和时间上下文中的字符串和数字字面值。MySQL承认日期
这些格式的值:
作为两个中的一个字符串
'
或YYYY-MM-DD
''
格式。一个”放松”允许使用语法:任何标点字符都可以用作日期部分之间的分隔符。例如,YY-MM-DD
'“2012-12-31”
,“2012/12/31”
,2012 ^ ^ 12 31
,2012 @12@31
是等价的。作为一个没有分隔符的字符串
'
或名称
''
格式,前提是字符串作为日期有意义。例如,YYMMDD
'“20070523”
而且“070523”
被解读为“2007-05-23”
,但“071332”
是非法的(它有荒谬的月和日部分),并成为“0000-00-00”
.作为一个数字
名称
或YYMMDD
格式,前提是该数字作为日期有意义。例如,19830905
而且830905
被解读为“1983-09-05”
.
作为两个中的一个字符串
'
或YYYY-MM-DD hh: mm: ss
''
格式。一个”放松”这里也允许使用语法:任何标点字符都可以用作日期部分或时间部分之间的分隔符。例如,YY-MM-DD hh: mm: ss
'“2012-12-31 11:30:45”
,2012年^ ^ 12日31日11 + 30 + 45 '
,2012/12/31 11 * 30 * 45的
,“45 30 2012 @12@31 11 ^ ^”
是等价的。日期和时间部分与小数秒部分之间唯一可识别的分隔符是小数点。
日期和时间部分可以用
T
而不是一个空间。例如,“2012-12-31 11:30:45”
2012 - 12 - 31 t11:30:45
是等价的。作为一个没有分隔符的字符串
'
或YYYYMMDDhhmmss
''
格式,前提是字符串作为日期有意义。例如,YYMMDDhhmmss
'“20070523091528”
而且“070523091528”
被解读为“2007-05-23 09:15:28”
,但“071122129015”
是非法的(它有一个荒谬的分钟部分),并成为“0000-00-00”就是
.作为一个数字
YYYYMMDDhhmmss
或YYMMDDhhmmss
格式,前提是该数字作为日期有意义。例如,19830905132800
而且830905132800
被解读为“1983-09-05 13:28:00”
.
一个DATETIME
或时间戳
值可以包括以微秒(6位数)精度跟踪的小数秒部分。小数部分应该总是用小数点与其他时间分开;无法识别其他分数秒分隔符。有关MySQL中小数秒支持的信息,请参见第11.2.6节,“时间值中的小数秒”.
包含两位数年份值的日期是不明确的,因为世纪是未知的。MySQL使用以下规则来解释两位数的年值:
该范围内的年值
70 - 99
成为1970 - 1999
.该范围内的年值
00 - 69
成为2000 - 2069
.
另请参阅第11.2.8节,“日期中的两位年份”.
对于指定为包含日期部分分隔符的字符串的值,不需要为小于的月或日值指定两个数字10
.“2015-6-9”
就等于“2015-06-09”
.类似地,对于指定为包含时间部分分隔符的字符串的值,不需要为小时、分钟或秒值指定两个小于的数字10
.“2015-10-30 1:2:3”
就等于“2015-10-30 01:02:03”
.
指定为数字的值应该为6、8、12或14位。如果一个数字的长度为8或14位,则假定该数字为in名称
或YYYYMMDDhhmmss
格式,年份由前4位给出。如果号码长度为6位或12位,则认为是inYYMMDD
或YYMMDDhhmmss
格式,年份由前两位数字表示。不属于这些长度的数字被解释为用前导零填充到最接近的长度。
指定为非分隔字符串的值将根据其长度进行解释。对于长度为8或14个字符的字符串,年份假定由前4个字符给出。否则,年份被认为是由前两个字符给出的。字符串将从左到右进行解释,以查找字符串中存在的所有部分的年、月、日、小时、分钟和秒值。这意味着不应该使用少于6个字符的字符串。例如,如果指定“9903”
,认为它代表1999年3月,MySQL将其转换为”零”日期值。这是因为年和月的值是99
而且03
,但是白天的部分完全没有了。但是,您可以显式指定0的值来表示缺少的月或日部分。例如,插入值“1999-03-00”
,使用“990300”
.
MySQL承认时间
这些格式的值:
作为字符串
“D hh: mm: ss”
格式。您也可以使用以下方法之一”放松”语法:“hh: mm: ss”
,“hh: mm”
,“D hh: mm”
,“D hh”
,或“党卫军”
.在这里D
表示天数,取值范围从0到34。中没有分隔符的字符串
“hhmmss”
格式,前提是它在时间上有意义。例如,“101112”
是理解为“10:11:12”
,但“109712”
是非法的(它有一个荒谬的分钟部分),并成为“就是”
.作为一个数字
hhmmss
格式,前提是它在时间上有意义。例如,101112
是理解为“10:11:12”
.下面的替代格式也可以理解:党卫军
,mms
,或hhmmss
.
中识别尾随的小数秒部分“D hh: mm: ss.fraction”
,“hh: mm: ss.fraction”
,“hhmmss.fraction”
,hhmmss.fraction
时间格式,分数
是精度可达微秒(6位数)的小数部分。小数部分应该总是用小数点与其他时间分开;无法识别其他分数秒分隔符。有关MySQL中小数秒支持的信息,请参见第11.2.6节,“时间值中的小数秒”.
为时间
指定为包含时间部分分隔符的字符串的值,则不需要为小于的小时、分钟或秒值指定两个数字10
.“8:3:2”
就等于“08:03:02”
.
从MySQL 8.0.19开始,您可以在插入时指定时区偏移时间戳
而且DATETIME
值放入表中。偏移量被追加到datetime字面量的时间部分,没有间隔,并且使用与设置time_zone
系统变量,但有以下例外:
对于小于10的小时值,需要一个前导零。
的值
“0”
将被拒绝。时区名称,例如
“缺钱”
而且“亚洲/上海”
不能使用;“系统”
也不能在此上下文中使用。
插入的值不能为月部分、日部分或两者都为零。从MySQL 8.0.22开始强制执行,不管服务器SQL模式设置如何。
这个例子演示了如何将带有时区偏移量的datetime值插入时间戳
而且DATETIME
使用不同的列time_zone
设置,然后检索它们:
CREATE TABLE ts (-> id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY, -> col TIMESTAMP NOT NULL ->) AUTO_INCREMENT = 1;创建表dt (-> id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, -> col DATETIME NOT NULL ->)mysql> SET @@time_zone = 'SYSTEM';INSERT INTO ts (col) VALUES ('2020-01-01 10:10:10'), -> ('2020-01-01 10:10:10+05:30'), ('2020-01-01 10:10:10-08:00');mysql> SET @@time_zone = '+00:00';INSERT INTO ts (col) VALUES ('2020-01-01 10:10:10'), -> ('2020-01-01 10:10:10+05:30'), ('2020-01-01 10:10:10-08:00');mysql> SET @@time_zone = 'SYSTEM';mysql> INSERT INTO dt (col) VALUES ('2020-01-01 10:10:10'), -> ('2020-01-01 10:10:10+05:30'), ('2020-01-01 10:10:10-08:00');mysql> SET @@time_zone = '+00:00';mysql> INSERT INTO dt (col) VALUES ('2020-01-01 10:10:10'), -> ('2020-01-01 10:10:10+05:30'), ('2020-01-01 10:10:10-08:00'); mysql> SET @@time_zone = 'SYSTEM'; mysql> SELECT @@system_time_zone; +--------------------+ | @@system_time_zone | +--------------------+ | EST | +--------------------+ mysql> SELECT col, UNIX_TIMESTAMP(col) FROM dt ORDER BY id; +---------------------+---------------------+ | col | UNIX_TIMESTAMP(col) | +---------------------+---------------------+ | 2020-01-01 10:10:10 | 1577891410 | | 2019-12-31 23:40:10 | 1577853610 | | 2020-01-01 13:10:10 | 1577902210 | | 2020-01-01 10:10:10 | 1577891410 | | 2020-01-01 04:40:10 | 1577871610 | | 2020-01-01 18:10:10 | 1577920210 | +---------------------+---------------------+ mysql> SELECT col, UNIX_TIMESTAMP(col) FROM ts ORDER BY id; +---------------------+---------------------+ | col | UNIX_TIMESTAMP(col) | +---------------------+---------------------+ | 2020-01-01 10:10:10 | 1577891410 | | 2019-12-31 23:40:10 | 1577853610 | | 2020-01-01 13:10:10 | 1577902210 | | 2020-01-01 05:10:10 | 1577873410 | | 2019-12-31 23:40:10 | 1577853610 | | 2020-01-01 13:10:10 | 1577902210 | +---------------------+---------------------+
在选择datetime值时不会显示偏移量,即使在插入它时使用了偏移量。
支持的偏移值范围为13:59
来+夏令时间
、包容。
包含时区偏移量的Datetime字面值被准备好的语句接受为参数值。