这日期
那DATETIME
, 和时间戳
类型有关。本节描述它们的特点、相似之处和不同之处。MySQL承认日期
那DATETIME
, 和时间戳
以几种格式的值,描述于第9.1.3节,“日期和时间文字”。为了日期
和DATETIME
范围描述,“支持的“意味着虽然早期的价值可能有效,但没有保证。
这日期
类型用于具有日期部分但没有时间部分的值。mysql检索和显示日期
价值'
格式。支持范围为yyyy-mm-dd
'“1000-01-01”
至“9999-12-31”
。
这DATETIME
类型用于包含日期和时间部件的值。mysql检索和显示DATETIME
价值'
格式。支持范围为YYYY-MM-DD HH:MM:SS
''1000-01-01 00:00:00'
至'9999-12-31 23:59:59'
。
这时间戳
数据类型用于包含日期和时间部件的值。时间戳
有一系列的'1970-01-01 00:00:01'
UTC,“2038-01-19 03:14:07”
UTC。
一种DATETIME
或者时间戳
值可以包括尾随分秒部分,高达微秒(6位)精度。特别地,任何分数的一个分数部分插入A中DATETIME
或者时间戳
列被存储而不是丢弃。包含小数部分后,这些值的格式为'
,范围为YYYY-MM-DD HH:MM:SS
[.分数
]'DATETIME
价值是'1000-01-01 00:00:00.000000'
至“9999-12-31 23:59:59.999999”
的范围时间戳
价值是'1970-01-01 00:00:01.000000'
至“2038-01-19 03:14:07.999999”
。分数部分应始终与小数点与其他时间分开;没有识别其他小数分隔符。有关MySQL中的小数秒数支持的信息,请参阅第11.2.6节“时间值分数”。
这时间戳
和DATETIME
数据类型提供了对当前日期和时间的自动初始化和更新。有关更多信息,请参见第11.2.5节“自动初始化和更新时间戳和日期时间”。
MySQL转换时间戳
从当前时区到UTC的值存储,从UTC回到当前时区以进行检索。(这不会发生其他类型DATETIME
)。默认情况下,每个连接的当前时区是服务器的时间。可以根据每个连接设置时区。只要时区设置保持不变,就会得到存储的相同值。如果你存储一个时间戳
值,然后更改时区并检索该值,检索到的值与存储的值不同。这是因为在两个方向上没有使用同一时区进行转换。当前时区的值为时区
系统变量。有关更多信息,请参见第5.1.15节“MySQL Server时区支持”。
正如MySQL 8.0.19的那样,您可以在插入时指定时区偏移量时间戳
和DATETIME
值存储到表中。偏移量被附加到datetime文字的时间部分,没有插入空格,并使用与设置时区
系统变量,具有以下例外:
对于小于10的小时值,需要前导零。
价值
'-00:00'
被拒绝了。时区名称如
'欧洲东部时间'
和'亚洲/上海'
不能使用;“系统”
在这种情况下也不能使用。
插入的值的月部分、日部分或两个部分都不能为零。这从MySQL 8.0.22开始强制执行,不管服务器SQL模式设置如何。
此示例说明将DateTime值与时区偏移插入时间戳
和DATETIME
使用不同的列时区
设置,然后检索它们:
MySQL>创建表TS( - > ID Integer Not Null Auto_Increment主键, - > Col Timestamp Not Null - >)Auto_increment = 1;mysql> create table dt( - > id int not null auto_increment主键, - > col datetime not null - >)auto_increment = 1;mysql> set @@ time_zone ='system';mysql>插入ts(col)值('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>插入ts(col)值('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>插入dt(col)值('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>插入dt(col)值('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文字被准备好语句接受为参数值。
无效的日期
那DATETIME
, 或者时间戳
值转换为“零“适当类型的值('0000-00-00'
或者'0000-00-00 00:00:00'
)如果SQL模式允许此转换。精确的行为取决于哪种严格的SQL模式和no_zero_date.
SQL模式已启用;看第5.1.11节,“服务器SQL模式”。
在MySQL 8.0.22及以后版本中,您可以进行转换时间戳
UTC的值DATETIME
值时使用投()
与之在时区
操作符,如下所示:
mysql> SELECT col, > CAST(col AT TIME ZONE INTERVAL '+00:00' AS DATETIME) AS ut > FROM ts ORDER BY id;+---------------------+---------------------+ | 坳| ut | +---------------------+---------------------+ | 2020-01-01 10:10:10 | 2020-01-01 15:10:10 | | 2019-12-31 23:40:10 | 2020-01-01 04:40:10 | | 2020-01-01 13:10:10 | 2020-01-01 18:10:10 | | 2020-01-01 10:10:10 | 2020-01-01 15:10:10 | | 2020-01-01 04:40:10 | 2020-01-01 09:40:10 | | 2020-01-0118:10:10 | 2020-01-01 23:10:10 | +---------------------+---------------------+
有关语法和其他示例的完整信息,请参见投()
函数。
注意MySQL中日期值解释的某些属性:
mysql允许A.“轻松“指定为字符串的值的格式,其中任何标点字符都可以用作日期部分或时间部分之间的分隔符。在某些情况下,这种语法可能具有欺骗性。例如,值
'10:11:12'
可能看起来像时间值,因为:
,但被解释为年份'2010-11-12'
如果在日期上下文中使用。价值“10:45:15
被转换为'0000-00-00'
因为'45'
不是一个有效的月份。日期和时间部分与小数秒部分之间唯一可识别的分隔符是小数点。
服务器要求月和日的值是有效的,而不是分别在1到12和1到31的范围内。禁用严格模式时,无效日期如
“2004-04-31”
被转换成'0000-00-00'
并产生一个警告。启用严格模式后,无效日期将产生错误。允许这样的日期,使能allow_invalid_dates.
。看第5.1.11节,“服务器SQL模式”,以获取更多信息。mysql不接受
时间戳
在日期或月表中包含零的值或不是有效日期的值。这个规则的唯一例外是特殊的“零“价值'0000-00-00 00:00:00'
,如果SQL模式允许此值。精确的行为取决于哪种严格的SQL模式和no_zero_date.
SQL模式已启用;看第5.1.11节,“服务器SQL模式”。包含2位数的日期的日期是暧昧的,因为世纪未知。MySQL使用这些规则解释2位数的年份值:
范围内的年份值
00 - 69
成为2000-2069.
。范围内的年份值
70-99
成为1970 - 1999
。
另请参阅第11.2.8节“日期中的2位数”。