如何使用sys.time_zone_info获取用户自定义时区本地时间并适配夏令时
自定义时区映射方案
你需要额外维护一张自定义时区映射表,把用户侧可选的通俗时区名称(比如UTC+7、北京时间)和SQL Server系统表sys.time_zone_info中的标准时区名称做绑定,SQL Server本身不直接识别UTC±X、地区通俗名这类非标准时区标识。
- 映射表建表语句参考:
CREATE TABLE user_timezone_mapping ( user_tz_display_name NVARCHAR(50) PRIMARY KEY, -- 给用户展示的时区名称 sys_tz_standard_name NVARCHAR(128) NOT NULL, -- 对应sys.time_zone_info的name字段值 enable_dst BIT NOT NULL DEFAULT 1 -- 标记该时区是否启用夏令时规则 );
- 常见映射参考:
- 北京时间 →
China Standard Time - UTC+7 →
SE Asia Standard Time - 美国东部时间 →
US Eastern Standard Time
你可以执行SELECT name FROM sys.time_zone_info查询当前实例支持的所有标准时区名,按需补充到映射表中即可。
- 北京时间 →
自动适配夏令时的SQL写法
SQL Server的AT TIME ZONE语法原生支持自动读取sys.time_zone_info中的夏令时规则,不需要手动编写日期判断逻辑,只要以UTC时间为基准做两次时区转换即可自动完成夏令时调整。
通用转换模板
-- 入参:@user_selected_tz 为用户选择的通俗时区名,例如"北京时间" DECLARE @utc_origin_time DATETIME2 = GETUTCDATE(); -- 必须使用UTC时间作为转换基准,不要用GETDATE() DECLARE @target_sys_tz NVARCHAR(128) = (SELECT sys_tz_standard_name FROM user_timezone_mapping WHERE user_tz_display_name = @user_selected_tz); SELECT @utc_origin_time AS utc原始时间, @utc_origin_time AT TIME ZONE 'UTC' AT TIME ZONE @target_sys_tz AS 用户当地时间;
上述写法会自动匹配目标时区的夏令时规则:在夏令时生效时段自动调整偏移,非夏令时时段自动恢复标准偏移,完全符合你提到的「3-6月自动调快1小时、7月后恢复」的场景需求,不需要额外编写时间范围判断逻辑。
内容的提问来源于stack exchange,提问作者Weitat BIP
相关产品推荐
相关产品推荐

