写入的时区结果是不是有问题?

【TDengine 使用环境】
测试

【TDengine 版本】
3.3.6 LTS
【操作系统以及版本】Deepin25

【部署方式】容器

【集群节点数】1

【集群副本数】1

【描述业务影响】数据写入时的时区错误

【问题复现路径/shan】

#建库,存配置,常量和日志
CREATE DATABASE if not exists config_constant_log
duration 1d
keep 3650d
COMP 2
pagesize 1024
replica 1
vgroups 4
SINGLE_STABLE 0
WAL_LEVEL 1
WAL_FSYNC_PERIOD 5000
COMPACT_INTERVAL 30m
PRECISION ‘ms’

#建表,存交易所日历
create table if not exists config_constant_log.market_calendar (
write_moment TIMESTAMP,
trade_date TIMESTAMP
);

#写入少量样本数据
INSERT INTO config_constant_log.market_calendar (write_moment, trade_date) VALUES (‘2026-05-24 12:01:12.903622’,‘1990-12-19 00:00:00’),
(‘2026-05-24 12:02:28.903622’,‘1991-04-09 00:00:00’),
(‘2026-05-24 12:02:29.903622’,‘1991-04-10 00:00:00’),
(‘2026-05-24 12:02:30.903622’,‘1991-04-11 00:00:00’),
(‘2026-05-24 12:02:31.903622’,‘1991-04-12 00:00:00’),
(‘2026-05-24 12:02:32.903622’,‘1991-04-15 00:00:00’),
(‘2026-05-24 12:02:33.903622’,‘1991-04-16 00:00:00’),
(‘2026-05-24 12:02:34.903622’,‘1991-04-17 00:00:00’),
(‘2026-05-24 12:02:35.903622’,‘1991-04-18 00:00:00’);

#查询
SELECT * FROM config_constant_log.market_calendar limit 200;

问题:为什么4月15日以后的时间戳就会变成东9区?而4月12日之前的都是东8区?

这个问题不是 TDengine 的 bug,而是**中国历史夏令时(DST)**在时区数据库中的正确反映。

原因

中国曾在 1986~1991 年实行夏令时制度:

年份 夏令时时段 时区偏移
1986~1990 每年4月中旬~9月中旬 UTC+9
1991 4月14日 ~ 9月15日 UTC+9
  • 1991-04-12 → 夏令时之前 → +08:00 :white_check_mark:

  • 1991-04-15 → 夏令时之后 → +09:00 :white_check_mark:

TDengine 底层使用的时区数据库(如 glibc timezone database 或 IANA tzdata)正确包含了这段历史规则,所以同一个 YYYY-MM-DD HH:MM:SS 的字符串在不同年份/日期会映射到不同的 UTC offset。

影响与处理建议

场景 建议
只关心日期(trade_date),不关心具体时刻 不影响查询,+08:00 和 +09:00 的日期相同
需要统一按 UTC+8 处理 查询时显式转换:SELECT convert_tz(trade_date, @@session.time_zone, ‘+08:00’) 或用 UNIX_TIMESTAMP() 转 UTC 后再转
写入时强制指定时区 插入时带时区后缀:‘1991-04-15 00:00:00+08:00’
不想受历史 DST 影响 数据层面统一存储 UTC 时间,查询时再按需转换