加入收藏 | 设为首页 | 会员中心 | 我要投稿 威海站长网 (https://www.0631zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

自动初始化和更新 TIMESTAMP 或 DATETIME

发布时间:2022-11-26 00:01:06 所属栏目:MsSql教程 来源:未知
导读: TIMESTAMP[(fsp)]
时区处理
当存储 TIMESTAMP 时,TiDB 会将当前时区的 TIMESTAMP 值转换为 UTC 时区。当读取 TIMESTAMP 时,TiDB 将存储的 TIMESTAMP 值从 UTC 时区转换为当前时区(注意:

  1. TIMESTAMP[(fsp)]

时区处理

当存储 TIMESTAMP 时,TiDB 会将当前时区的 TIMESTAMP 值转换为 UTC 时区。当读取 TIMESTAMP 时,TiDB 将存储的 TIMESTAMP 值从 UTC 时区转换为当前时区(注意:DATETIME 不会这样处理)。每次连接的默认时区是服务器的本地时区,可以通过环境变量 time_zone 进行修改。

警告:

和 MySQL 一样,TIMESTAMP 数据类型受 2038 年问题的影响。如果存储的值大于 2038,建议使用 DATETIME 类型。

YEAR 类型

YEAR 类型的格式为 YYYY,支持的值范围是 1901 到 2155,也支持零值 0000。

  1. YEAR[(4)]

YEAR 类型遵循以下格式规则:

无效的 YEAR 值会自动转换为 0000(如果用户没有使用 NO_ZERO_DATE SQL 模式)。

自动初始化和更新 TIMESTAMP 或 DATETIME

带有 TIMESTAMP 或 DATETIME 数据类型的列可以自动初始化为或更新为当前时间。

对于表中任何带有 TIMESTAMP 或 DATETIME 数据类型的列,你可以设置默认值,或自动更新为当前时间戳。

在定义列的时候,TIMESTAMP 和 DATETIME 可以通过 DEFAULT CURRENT_TIMESTAMP 和 ON UPDATE CURRENT_TIMESTAMP 来设置。DEFAULT 也可以设置为一个特定的值,例如 DEFAULT 0 或 DEFAULT '2000-01-01 00:00:00'。

  1. CREATE TABLE t1 (
  2. ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  3. dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
  4. );

除非指定 DATETIME 的值为 NOT NULL,否则默认 DATETIME 的值为 NULL。指定 DATETIME 的值为 NOT NULL 时,如果没有设置默认值,则默认值为 0。

  1. CREATE TABLE t1 (
  2. dt1 DATETIME ON UPDATE CURRENT_TIMESTAMP, -- default NULL
  3. dt2 DATETIME NOT NULL ON UPDATE CURRENT_TIMESTAMP -- default 0
  4. );

时间值的小数部分

DATETIME 和 TIMESTAMP 值最多可以有 6 位小数,精确到毫秒。如果包含小数部分,值的格式为 YYYY-MM-DD HH:MM:SS[.fraction],小数部分的范围为 000000 到999999。必须使用小数点分隔小数部分与其他部分。

日期和时间类型的转换

在日期和时间类型之间进行转换时,有些转换可能会导致信息丢失。例如,DATE、DATETIME 和 TIMESTAMP 都有各自的有效值范围。TIMESTAMP 不能早于 UTC 时间的 1970 年Mssq类型转换函数,也不能晚于 UTC 时间的 2038-01-19 03:14:07。根据这个规则,1968-01-01 对于 DATE 或 DATETIME 是有效的,但当 1968-01-01 转换为 TIMESTAMP 时,就会变成 0。

DATE 的转换:

DATETIME 或 TIMESTAMP 的转换:

如果要将 TIME 转换为其他时间和日期格式,日期部分会自动指定为 CURRENT_DATE()。最终的转换结果是由 TIME 和 CURRENT_DATE() 组成的日期。也就是说,如果 TIME 的值超出了 00:00:00 到 23:59:59 的范围,那么转换后的日期部分并不表示当前的日期。

当 TIME 转换为 DATE 时,转换过程类似,时间部分被舍弃。

使用 CAST() 函数可以显式地将值转换为 DATE 类型。例如:

  1. date_col = CAST(datetime_col AS DATE)

将 TIME 和 DATETIME 转换为数字格式。例如:

  1. SELECT CURTIME(), CURTIME()+0, CURTIME(3)+0;

  1. +-----------|-------------|--------------+
  2. | CURTIME() | CURTIME()+0 | CURTIME(3)+0 |
  3. +-----------|-------------|--------------+
  4. | 09:28:00 | 92800 | 92800.887 |
  5. +-----------|-------------|--------------+

  1. SELECT NOW(), NOW()+0, NOW(3)+0;

  1. +---------------------|----------------|--------------------+
  2. | NOW() | NOW()+0 | NOW(3)+0 |
  3. +---------------------|----------------|--------------------+
  4. | 2012-08-15 09:28:00 | 20120815092800 | 20120815092800.889 |
  5. +---------------------|----------------|--------------------+

年份为两位数

如果日期中包含年份为两位数,这个年份是有歧义的,并不显式地表示实际年份。

对于 DATETIME、DATE 和 TIMESTAMP 类型,TiDB 使用如下规则来消除歧义。

上述规则也适用于 YEAR 类型,但有一个例外。将数字 00 插入到 YEAR(4) 中时,结果是 0000 而不是 2000。

如果想让结果是 2000,需要指定值为 2000。

对于 MIN() 和 MAX() 等函数,年份为两位数时可能会得到错误的计算结果。建议年份为四位数时使用这类函数。

(编辑:威海站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!