数据库时区

Mysql有dataTime和Timestamp,

dataTime:没有时区概念的

Timestamp:有时区概念的

当前我的Mysql配置的时区是UTC+8

CREATE TABLE t (
  dt DATETIME,
  ts TIMESTAMP
);

INSERT INTO t VALUES ('2026-01-07 10:00:00', '2026-01-07 10:00:00');

TIMESTAMP 的 2026-01-07 10:00:00,会自动带上时区概念2026-01-07 10:00:00(UTC+8)

对于DATETIME和TIMESTAMP,查询起来虽然看起来都是2026-01-07 10:00:00

但是实际的底层存储会转化成标准的UTC时间

写入时: 会话时区 → 转 UTC 存储

查询时: UTC → 会话时区

DATETIME 是 2026-01-07 10:00:00

TIMESTAMP则是 2026-01-07 02:00:00

由于客户端查询的会话带有时区,因此对于TIMESTAMP会把UTC时间转化为对应的带时区的时间, 2026-01-07 02:00:00转成东8区,就加上8,看起来是2026-01-07 10:00:00

如果客户端查询的会话没有时区,2026-01-07 02:00:00就还是显示2026-01-07 02:00:00

PostgreSql

timestamp:无时区(类似于mysql的DATETIME)

timestamptz:有时区(类似于mysqlTIMESTAMP)

Orcale

DATE:无时区,精确到秒

TIMESTAMP:无时区,精确到纳秒

TIMESTAMP WITH LOCAL TIME ZONE:有时区,(类似于mysqlTIMESTAMP)