相关的文档10bet官方网站 本手册下载
PDF (Ltr)- 41.5 mb
PDF (A4)- 41.6 mb
手册页(TGZ)- 262.1 kb
手册页(邮政编码)- 372.2 kb
信息(Gzip)- 4.0 mb
信息(邮政编码)- 4.0 mb
本手册节选

9.1.3日期和时间字面值

日期和时间值可以用几种格式表示,例如带引号的字符串或数字,这取决于值的确切类型和其他因素。例如,在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的范围时间戳类型,其年份范围从00019999.(MySQL时间戳年的范围是19702038.)

日期和时间上下文中的字符串和数字字面值。MySQL承认日期这些格式的值:

  • 作为两个中的一个字符串YYYY-MM-DDYY-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”

MySQL承认DATETIME而且时间戳这些格式的值:

  • 作为两个中的一个字符串YYYY-MM-DD hh: mm: ssYY-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是等价的。

  • 作为一个没有分隔符的字符串YYYYMMDDhhmmssYYMMDDhhmmss格式,前提是字符串作为日期有意义。例如,“20070523091528”而且“070523091528”被解读为“2007-05-23 09:15:28”,但“071122129015”是非法的(它有一个荒谬的分钟部分),并成为“0000-00-00”就是

  • 作为一个数字YYYYMMDDhhmmssYYMMDDhhmmss格式,前提是该数字作为日期有意义。例如,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位,则认为是inYYMMDDYYMMDDhhmmss格式,年份由前两位数字表示。不属于这些长度的数字被解释为用前导零填充到最接近的长度。

指定为非分隔字符串的值将根据其长度进行解释。对于长度为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字面值被准备好的语句接受为参数值。