如何在SQL Server中根据存储的时区名称查询对应UTC偏移量
SQL Server中通过IANA时区名称获取UTC偏移量的实现方案
高版本(SQL Server 2016及以上)原生实现
从SQL Server 2016开始,系统内置了sys.time_zone_info系统视图,直接收录了全量IANA格式的时区信息,和你存储的America/Vancouver这类格式完全匹配,不需要额外建表。
- 视图核心可用字段:
name:标准IANA时区名称,可直接和业务表存储的时区字段做关联匹配current_utc_offset:对应时区当前生效的UTC偏移量,输出格式就是-08:00这类字符串,完全匹配需求
- 通用查询示例(替换成自己的业务表名和时区字段名即可):
SELECT biz.time_zone_name, tz.current_utc_offset FROM 你的业务表 biz INNER JOIN sys.time_zone_info tz ON tz.name = biz.time_zone_name
注意:返回的偏移量会自动跟随夏令时规则切换,比如Vancouver所在时区在夏令时期间偏移为
-07:00,冬令时为-08:00,和现实时区规则完全一致。
低版本(SQL Server 2014及更早)实现方案
低版本没有内置IANA时区支持,无法直接通过系统视图匹配查询,需要手动维护一份时区映射字典表:
- 映射表需要存储三个核心内容:IANA时区名称、对应的Windows系统时区标识、固定标准UTC偏移量
- 因为低版本没有内置时区计算函数,如果需要动态计算夏令时的偏移量,实现成本较高,更建议直接在映射表中存储对应时区的当前固定偏移,业务侧定期更新即可
- 示例查询逻辑:
SELECT biz.time_zone_name, map.standard_utc_offset FROM 你的业务表 biz INNER JOIN tz_iana_timezone_map map ON map.iana_timezone_name = biz.time_zone_name
常见踩坑提示
- IANA时区和Windows时区的命名规则完全不同,比如
America/Vancouver对应的Windows时区标识是Pacific Standard Time,不要直接拿业务表存的IANA值去匹配Windows时区字符串,会出现匹配失败的问题 - 如果业务需要的是不随夏令时变化的固定标准偏移量,不要使用
sys.time_zone_info的current_utc_offset字段,需要在自定义映射表中单独存储标准偏移值
内容的提问来源于stack exchange,提问作者Haresh Makwana
相关产品推荐
相关产品推荐

