You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

伊朗停止夏令时后SQL Server返回错误时区信息的解决求助

解决Docker部署SQL Server 2019中伊朗时区夏令时未更新的问题

问题根源:SQL Server的时区规则数据是内置在自身程序中的,和容器系统的时区数据相互独立。即使容器内date命令返回正确时区,SQL Server的sys.time_zone_info表仍会使用旧的规则,直到通过累积更新(CU)推送新的时区数据。

一、彻底解决方案:更新SQL Server至最新累积更新

微软会在SQL Server的累积更新中同步全球时区政策变化(比如伊朗取消夏令时),这是最彻底的解决方式:

  • 拉取包含最新CU的SQL Server 2019镜像:
    docker pull mcr.microsoft.com/mssql/server:2019-latest --pull always
    
    加上--pull always确保拉取的是最新版本,避免使用本地缓存的旧镜像。
  • 停止并删除旧容器(注意备份数据),重新部署新容器,保留原有数据卷配置。
  • 验证修复:执行以下查询确认时区信息
    SELECT name, current_utc_offset, is_currently_dst
    FROM sys.time_zone_info
    WHERE name LIKE '%iran%'
    
    正常情况下is_currently_dst会返回0,表示夏令时已被禁用。

二、临时 workaround(无法立即更新CU时使用)

1. 直接计算UTC+04:30本地时间

伊朗当前固定为UTC+04:30时区,无需切换夏令时,可直接通过UTC时间转换:

SELECT DATEADD(minute, 270, GETUTCDATE()) AS Iran_Local_Time

(270分钟等于4.5小时,对应UTC+04:30偏移量)

2. 封装自定义函数替代GETDATE()

如果需要兼容现有代码,创建一个自定义函数来返回正确的伊朗本地时间:

CREATE FUNCTION dbo.GetIranLocalTime()
RETURNS DATETIME
AS
BEGIN
    RETURN CONVERT(DATETIME, SWITCHOFFSET(SYSDATETIMEOFFSET(), '+04:30'))
END

之后将代码中所有GETDATE()替换为dbo.GetIranLocalTime()即可:

SELECT dbo.GetIranLocalTime()

3. 强制容器使用伊朗时区(辅助缓解)

启动容器时指定TZ环境变量,让SQL Server的部分时间函数使用系统时区偏移:

docker run -e TZ="Asia/Tehran" -e ACCEPT_EULA=Y -e SA_PASSWORD=YourStrongPass@word -p 1433:1433 --name sqlserver2019 -d mcr.microsoft.com/mssql/server:2019-latest

注意:此方法不会修正sys.time_zone_info表中的错误数据,但能让SYSDATETIMEOFFSET()返回正确的偏移量,部分依赖该函数的场景会恢复正常。


内容的提问来源于stack exchange,提问作者mostafa8026

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 07:02:48