10bet网址
MySQL 8.0参考手册
相关文件10bet官方网站 下载本手册 从本手册中摘录

11.2.2 DATE、DATETIME和TIMESTAMP类型

日期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位数”