数据库时区
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)