MySQL 8.0 参考手册  / 第9章语言结构  / 9.1 文字值  /  9.1.3 日期和时间文字

9.1.3 日期和时间文字

日期和时间值可以用多种格式表示,例如带引号的字符串或数字,具体取决于值的确切类型和其他因素。例如,在 MySQL 需要日期的上下文中,它将 、 和 中的任何一个解释 '2015-07-21''20150721'日期20150721

本节介绍日期和时间文字可接受的格式。有关时间数据类型的更多信息,例如允许值的范围,请参阅 第 11.2 节,“日期和时间数据类型”

标准 SQL 和 ODBC 日期和时间文字

标准 SQL 需要使用类型关键字和字符串指定时间文字。关键字和字符串之间的空格是可选的。

DATE 'str'
TIME 'str'
TIMESTAMP 'str'

MySQL 可以识别,但与标准 SQL 不同,它不需要 type 关键字。符合标准的应用程序应该包括时间文字的类型关键字。

MySQL 还识别与标准 SQL 语法相对应的 ODBC 语法:

{ d 'str' }
{ t 'str' }
{ ts 'str' }

在 MySQL 5.6.4 之前,MySQL 会忽略 type 关键字,并且前面的每个构造都会生成字符串值 ,类型为。 'str'VARCHAR

从 5.6.4 开始,MySQL 使用类型关键字和 ODBC 构造分别生成DATETIMEDATETIME值,如果指定,包括尾随的小数秒部分。该 TIMESTAMP语法 DATETIME在 MySQL 中生成一个值,因为 DATETIME其范围更接近于标准 SQL TIMESTAMP类型,其年份范围从00019999. (MySQL TIMESTAMP年份范围是 19702038。)

日期和时间上下文中的字符串和数字文字

MySQL 识别DATE这些格式的值:

  • 作为 或 格式的字符串。允许使用宽松语法:任何标点符号都可以用作日期部分之间的分隔符。例如,、 、 和 是等价的。 'YYYY-MM-DD''YY-MM-DD''2012-12-31''2012/12/31''2012^12^31''2012@12@31'

  • 作为在 或 格式中都没有定界符的字符串,前提是该字符串作为日期有意义。例如,and 被解释为 ,但 它是非法的(它有无意义的月和日部分)并变为 。 'YYYYMMDD''YYMMDD''20070523''070523''2007-05-23''071332''0000-00-00'

  • 作为YYYYMMDDYYMMDD格式的数字,前提是该数字作为日期有意义。例如, 19830905830905 被解释为'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'是等价的。

  • 作为在 或 格式中都没有定界符的字符串,前提是该字符串作为日期有意义。例如,and 被解释为 ,但 它是非法的(它有一个无意义的微小部分)并变为。 'YYYYMMDDhhmmss''YYMMDDhhmmss''20070523091528''070523091528''2007-05-23 09:15:28''071122129015''0000-00-00 00:00:00'

  • 作为 YYYYMMDDhhmmssYYMMDDhhmmss格式的数字,前提是该数字作为日期有意义。例如, 19830905132800830905132800被解释为 '1983-09-05 13:28:00'

DATETIME或 值可以包含 一个TIMESTAMP尾随小数秒部分,精度可达微秒(6 位)。小数部分应始终用小数点与其余时间分开;不识别其他小数秒定界符。有关 MySQL 中小数秒支持的信息,请参阅 第 11.2.7 节,“时间值中的小数秒”

包含两位数年份值的日期是不明确的,因为世纪是未知的。MySQL 使用这些规则解释两位数的年份值:

  • 范围内的年份值70-99变为 1970-1999.

  • 范围内的年份值00-69变为 2000-2069.

另见第 11.2.9 节,“日期中的两位数年份”

对于指定为包含日期部分定界符的字符串的值,不必为小于 的月或日值指定两位数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 位,则假定为YYYYMMDDYYYYMMDDhhmmss格式,并且年份由前 4 位数字给出。如果数字的长度为 6 或 12 位,则假定为 YYMMDDYYMMDDhhmmss格式,并且年份由前 2 位数字给出。不是这些长度之一的数字被解释为好像用前导零填充到最接近的长度。

指定为非定界字符串的值根据其长度进行解释。对于 8 或 14 个字符长的字符串,假定年份由前 4 个字符给出。否则,假定年份由前 2 个字符给出。从左到右解释字符串以查找年、月、日、小时、分钟和秒值,对于字符串中存在的所有部分。这意味着您不应使用少于 6 个字符的字符串。例如,如果您指定'9903',认为代表 1999 年 3 月,MySQL 会将其转换为 日期值。发生这种情况是因为年份和月份值是9903,但是天部分完全丢失了。但是,您可以明确指定零值来表示缺少的月份或日期部分。例如,要插入值'1999-03-00',请使用 '990300'

MySQL 识别TIME这些格式的值:

  • 作为'D hh:mm:ss' 格式的字符串。您还可以使用以下 宽松语法 之一:'hh:mm:ss'、、、、 或。这里 代表天,可以有一个从 0 到 34 的值。 'hh:mm''D hh:mm''D hh''ss'D

  • 作为 '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''hhmmss.fraction'hhmmss.fraction时间格式识别,其中 fraction小数部分最高可达微秒(6 位)精度。小数部分应始终用小数点与其余时间分开;不识别其他小数秒定界符。有关 MySQL 中小数秒支持的信息,请参阅 第 11.2.7 节,“时间值中的小数秒”

对于TIME指定为包含时间部分定界符的字符串的值,无需为小于 的小时、分钟或秒值指定两位数10'8:3:2'与 相同 '08:03:02'