官方文档地址: 9.1.3 Date and Time Literals
字面量:在计算机科学中,字面量(literal
)是用于表达源代码中一个固定值的表示法(notation
)。
ODBC:开放数据库连接(Open Database Connectivity
,ODBC
)是为解决异构数据库间的数据共享而产生的,现已成为WOSA
(The Windows Open System Architecture
(Windows
开放系统体系结构))的主要部分和基于Windows
环境的一种数据库访问接口标准。
日期和时间值可以用几种格式表示,比如带引号的字符串或数字,这取决于值的确切类型和其他因素。例如,在 MySQL 期望日期的情况下,它会将'2015-07-21'
,'20150721'
,和20150721
都作为日期解释。
本节描述日期和时间字面量的可接受格式。有关时态数据类型的更多信息,如允许值的范围,请参见 11.2 日期和时间数据类型。
标准 SQL 和 ODBC 日期和时间字面量
标准 SQL 要求使用一个类型关键字和一个字符串指定时态字面量。关键字和字符串之间的空格是可选的。
DATE 'str'
TIME 'str'
TIMESTAMP 'str'
MySQL 可以识别,但是不像标准的 SQL,不需要类型关键字。符合标准的应用程序应该包含用于时态字面量的类型关键字。
MySQL 也能识别对应于标准 SQL 语法的 ODBC 语法:
{ d 'str' }
{ t 'str' }
{ ts 'str' }
MySQL 使用类型关键字和 ODBC 结构来生成DATE
、TIME
和DATETIME
值,如果指定了,还包括末尾的小数秒部分。TIMESTAMP
语法在 MySQL 中产生一个DATETIME
值,因为DATETIME
的范围更接近于标准 SQL 的TIMESTAMP
类型,它的年份范围从0001
到9999
。(MySQL 的TIMESTAMP
类型的年份范围是1970
到2038
。)
日期和时间上下文中的字符串和数字字面量
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
格式的数字,只要这个数字能作为一个日期。例如,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
格式的数字,只要这个数字能作为一个日期。例如,19830905132800
和830905132800
被解释为'1983-09-05 13:28:00'
。
DATETIME
或者TIMESTAMP
可以包括末尾的小数秒部分,精度最高可达微秒(6位)。小数部分总是与其余部分用小数点隔开;不识别其他小数秒分隔符。有关 MySQL 中小数秒支持的信息,参见 11.2.6 时间值的小数秒。
包含两位数年份值的日期不明确,因为世纪是未知的。MySQL 使用以下规则来解释两位数的年份值:
- 年值在
00-69
的范围将被解释为2000-2069
。 - 年值在
70-99
的范围将被解释为1970-1999
。
参见 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 位,则假定该数字为YYYYMMDD
或YYYYMMDDhhmmss
格式,年份由前 4 位给出。如果数字长度为 6 位或 12 位,则假定为YYMMDD
或YYMMDDhhmmss
格式,年份由前两位给出。不属于这些长度之一的数字被解释为用前导 0 填充到最接近的长度。
指定为非分隔字符串的值将根据其长度进行解释。对于长度为 8 或 14 个字符的字符串,假设年份由前 4 个字符给出。否则,假定年份由前两个字符给出。该字符串从左到右进行解释,以查找年、月、日、小时、分钟和秒的值,以及字符串中存在的所有部分。这意味着你不应该使用少于 6 个字符的字符串。例如,如果你指定'9903'
,认为它代表1999
年3
月,MySQL 将会把它转换为"零"日期值。这是因为年和月的值分别是99
和03
,但是日部分完全丢失了。但是,您可以显式地指定 0 值来表示缺少的月或日部分。如,要插入值'1999-03-00'
,请使用'990300'
。
MySQL 可以识别以下格式的TIME
值:
- 作为
'D hh:mm:ss'
格式的字符串。你也可以使用下面的一种“放松”语法:'hh:mm:ss'
,'hh:mm'
,'D hh:mm'
,'D hh'
或者'ss'
。 这里D
表示天数,值可以从0
到34
。 - 在
'hhmmss'
格式中作为没有分隔符的字符串,前提是它作为时间有意义。例如,'101112'
被理解为'10:11:12'
,但'109712'
是非法的(它有一个无意义的分钟部分),将变为'00:00:00'
。 - 作为
hhmmss
格式的数字,前提是它作为时间有意义。例如,101112
被理解为'10:11:12'
。以下格式也可以理解:ss
、mmss
或hhmmss
。
末尾的小数秒部分在'D hh:mm:ss.fraction'
、'hh:mm:ss.fraction'
、'hhmms .fraction'
和'hhmmss.fraction'
格式中被识别。其中fraction
是精确到微秒(6位)的小数部分。小数部分总是与其余部分用小数点隔开;不识别其他小数秒分隔符。关于 MySQL 中对小数秒的支持,参见 11.2.6 时间值的小数秒。
对于指定为包含时间部分分隔符的字符串的时间值,不需要为小于 10 的小时、分钟或秒值指定两位数字。'8:3:2'
和'08:03:02'
是一样的。