9.1.3 日期和时间 Literals
日期和时间值可以用多种格式 table 示,例如带引号的字符串或数字,具体取决于值的确切类型和其他因素。例如,在 MySQL 需要日期的上下文中,它将'2015-07-21'
,'20150721'
和20150721
中的任何一个都解释为日期。
本节介绍日期和时间 Literals 的可接受格式。有关时间数据类型的更多信息,例如允许值的范围,请参见第 11.2 节“日期和时间数据类型”。
标准 SQL 和 ODBC 日期和时间 Literals. 标准 SQL 要求使用 type 关键字和字符串指定时间 Literals。关键字和字符串之间的空格是可选的。
DATE 'str'
TIME 'str'
TIMESTAMP 'str'
MySQL 可以识别,但是与标准 SQL 不同,它不需要 type 关键字。要符合标准的应用程序应包括用于时间 Literals 的 type 关键字。
MySQL 还可以识别与标准 SQL 语法相对应的 ODBC 语法:
{ d 'str' }
{ t 'str' }
{ ts 'str' }
MySQL 使用 type 关键字和 ODBC 结构分别产生DATE,TIME和DATETIME值,如果指定,则包括尾随小数秒部分。 TIMESTAMP语法在 MySQL 中产生DATETIME值,因为DATETIME的范围更接近于标准 SQL TIMESTAMP类型,其范围从0001
到9999
。 (MySQL TIMESTAMP年的范围是1970
到2038
。)
日期和时间上下文中的字符串和数字 Literals. MySQL 可以识别以下格式的DATE值:
-
作为
'YYYY-MM-DD'
或'YY-MM-DD'
格式的字符串。允许使用“宽松”语法:任何标点符号都可以用作日期部分之间的分隔符。例如,'2012-12-31'
,'2012/12/31'
,'2012^12^31'
和'2012@12@31'
是等效的。 -
作为不带分隔符的
'YYYYMMDD'
或'YYMMDD'
格式的字符串,前提是该字符串作为日期有意义。例如,'20070523'
和'070523'
被解释为'2007-05-23'
,但是'071332'
是非法的(它具有无意义的月份和日期部分)并变成'0000-00-00'
。 -
以*
YYYYMMDD
或YYMMDD
*格式的数字 table 示,只要该数字作为日期有意义。例如,19830905
和830905
被解释为'1983-09-05'
。
MySQL 可以识别以下格式的DATETIME和TIMESTAMP值:
- 作为
'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'
和'2012@12@31 11^30^45'
是等效的。
在日期和时间部分与小数秒部分之间唯一识别的分隔符是小数点。
日期和时间部分可以用T
而不是空格分隔。例如,'2012-12-31 11:30:45'
'2012-12-31T11:30:45'
是等效的。
-
作为不带分隔符的
'YYYYMMDDhhmmss'
或'YYMMDDhhmmss'
格式的字符串,前提是该字符串作为日期有意义。例如,'20070523091528'
和'070523091528'
被解释为'2007-05-23 09:15:28'
,但是'071122129015'
是非法的(它具有无意义的分钟部分)并变为'0000-00-00 00:00:00'
。 -
以*
YYYYMMDDhhmmss
或YYMMDDhhmmss
*格式的数字 table 示,只要该数字作为日期有意义。例如,19830905132800
和830905132800
被解释为'1983-09-05 13:28:00'
。
DATETIME或TIMESTAMP值可以包含尾随的小数秒部分,精度最高为微秒(6 位数)。小数部分应始终与其余时间用小数点分隔;没有其他小数秒分隔符被识别。有关 MySQL 中小数秒支持的信息,请参见第 11.2.7 节“时间值的分数秒”。
包含两位数年份值的日期是不明确的,因为世纪是未知的。 MySQL 使用以下规则解释两位数的年份值:
-
70-99
范围内的年份值变为1970-1999
。 -
00-69
范围内的年份值变为2000-2069
。
对于指定为包含日期部分定界符的字符串的值,没有必要为小于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 位数字,则假定采用* YYYYMMDD
或 YYYYMMDDhhmmss
格式,并且年份由前 4 位数字给出。如果数字为 6 或 12 位数字,则假定格式为 YYMMDD
或 YYMMDDhhmmss
*格式,并且年份由前两位数字给出。不是这些长度之一的数字将被解释为用前导零填充到最接近的长度。
指定为非定界字符串的值将根据其长度进行解释。对于 8 或 14 个字符长的字符串,假定年份由前 4 个字符给出。否则,假定年份由前两个字符给出。该字符串从左到右进行解释,以查找年,月,日,小时,分钟和秒的值,以查找字符串中存在的尽可能多的部分。这意味着您不应使用少于 6 个字符的字符串。例如,如果您指定'9903'
,以 table 示 1999 年 3 月,则 MySQL 会将其转换为“零”日期值。发生这种情况的原因是年和月的值分别为99
和03
,但是日期部分完全缺失。但是,您可以显式指定零值来 table 示缺少的月份或日期部分。例如,要插入值'1999-03-00'
,请使用'990300'
。
MySQL 可以识别以下格式的TIME值:
-
作为*
'D hh:mm:ss'
格式的字符串。您还可以使用以下“松弛”语法之一:'hh:mm:ss'
,'hh:mm'
,'D hh:mm'
,'D hh'
或'ss'
*。 *D
*代 table 天,其值可以从 0 到 34. -
作为没有定界符的字符串,格式为*
'hhmmss'
*,前提是在时间上有意义。例如,'101112'
被理解为'10:11:12'
,但是'109712'
是非法的(它具有无意义的分钟部分)并变为'00:00:00'
。 -
以*
hhmmss
格式的数字 table 示,但前提是它可以作为时间使用。例如,101112
被理解为'10:11:12'
。还可以理解以下替代格式:ss
,mmss
或hhmmss
*。
尾随小数秒部分以* 'D hh:mm:ss.fraction'
, 'hh:mm:ss.fraction'
, 'hhmmss.fraction'
和 hhmmss.fraction
*时间格式识别,其中fraction
是小数部分,精度最高为微秒(6 位数)。小数部分应始终与其余时间用小数点分隔;没有其他小数秒分隔符被识别。有关 MySQL 中小数秒支持的信息,请参见第 11.2.7 节“时间值的分数秒”。
对于指定为包含时间部分定界符的字符串的TIME值,无需为小于10
的小时,分钟或秒值指定两位数字。 '8:3:2'
与'08:03:02'
相同。