ClickHouse时区问题:Asia/Tehran时区时间偏移异常
ClickHouse Asia/Tehran时区偏移错误解决指引
问题原因
伊朗的时区规则(夏令时/标准时切换)存在更新,但你的ClickHouse实例依赖的时区数据库未同步到最新规则,导致Asia/Tehran被解析为UTC+04:30而非预期的UTC+03:30。
解决步骤
1. 检查时区数据库版本
先确认ClickHouse使用的时区数据版本:
SELECT timezoneDatabase();
如果返回版本低于2024a(或对应年份的最新tzdata版本),说明需要更新时区数据。
2. 更新时区数据库
根据部署方式选择对应操作:
Linux物理机/虚拟机部署:
升级系统的tzdata包(ClickHouse会复用系统时区数据):# Debian/Ubuntu sudo apt update && sudo apt install --only-upgrade tzdata # RHEL/CentOS/Rocky Linux sudo dnf update tzdata升级完成后重启ClickHouse服务:
sudo systemctl restart clickhouse-serverDocker部署:
拉取最新的ClickHouse官方镜像(新版本默认包含更新的tzdata):docker pull clickhouse/clickhouse-server:latest重启容器:
docker restart <你的ClickHouse容器名称>
3. 验证修复效果
重新执行原查询验证结果:
SELECT formatDateTime(now(), '%Y-%m-%d %H:%M:%S', 'Asia/Tehran');
也可以同时对比UTC时间确认偏移量:
SELECT now() AS utc_time, formatDateTime(now(), '%Y-%m-%d %H:%M:%S', 'Asia/Tehran') AS tehran_time;
正常情况下tehran_time应为utc_time减去3小时30分。
4. 临时 workaround(无法立即更新时)
如果暂时无法更新时区数据,可通过以下方式临时修正:
- 手动调整时间偏移:
SELECT formatDateTime(date_add('minute', -210, now()), '%Y-%m-%d %H:%M:%S') AS tehran_time; - 设置会话级时区为固定偏移:
SET time_zone = 'UTC+03:30'; SELECT formatDateTime(now(), '%Y-%m-%d %H:%M:%S');
内容的提问来源于stack exchange,提问作者Bahram Jannesar
相关产品推荐
相关产品推荐

