在跨国业务或者多地区部署的系统中,不同用户所在时区不同,存储和处理时间数据时经常需要跨时区转换。SQL Server从2016版本开始支持AT TIME ZONE语法,能够直接完成时间值的时区转换,在存储过程中使用该语法可以高效处理跨时区时间逻辑。

AT TIME ZONE语法基础
AT TIME ZONE的作用是将datetimeoffset或者可转换为datetimeoffset的时间值,转换到指定的时区,语法格式如下:
-- 基础语法 input_date AT TIME ZONE target_timezone
其中input_date是待转换的时间值,target_timezone是目标时区的标识,时区标识需要使用数据库支持的时区名称,比如UTC、China Standard Time、Eastern Standard Time等。
存储过程中使用AT TIME ZONE实现转换
下面编写一个存储过程,实现将用户输入的本地时间转换为UTC时间,同时支持将UTC时间转换为指定时区的时间:
CREATE PROCEDURE dbo.Sp_Timezone_Convert
@input_time DATETIME2, -- 输入的时间值,无时区信息
@source_timezone NVARCHAR(50), -- 输入时间对应的源时区
@target_timezone NVARCHAR(50), -- 目标时区
@converted_time DATETIMEOFFSET OUTPUT -- 转换后的带时区时间
AS
BEGIN
SET NOCOUNT ON;
-- 第一步:给输入时间附加源时区信息,转换为datetimeoffset类型
DECLARE @source_timezone_time DATETIMEOFFSET;
SET @source_timezone_time = @input_time AT TIME ZONE @source_timezone;
-- 第二步:将带源时区的时间转换到目标时区
SET @converted_time = @source_timezone_time AT TIME ZONE @target_timezone;
-- 返回转换后的时间字符串(可选)
SELECT
@input_time AS 原始输入时间,
@source_timezone AS 源时区,
@source_timezone_time AS 源时区时间,
@target_timezone AS 目标时区,
@converted_time AS 目标时区时间;
END
GO
存储过程调用示例
假设需要将北京时间2024年5月1日12点转换为美国东部时间,调用方式如下:
DECLARE @result DATETIMEOFFSET;
-- 源时区为China Standard Time,目标时区为Eastern Standard Time
EXEC dbo.Sp_Timezone_Convert
@input_time = '2024-05-01 12:00:00',
@source_timezone = 'China Standard Time',
@target_timezone = 'Eastern Standard Time',
@converted_time = @result OUTPUT;
常见时区标识说明
不同数据库的时区标识可能存在差异,SQL Server支持的常用时区标识如下:
| 时区名称 | 时区标识 | 时差(相对于UTC) |
|---|---|---|
| 协调世界时 | UTC | UTC+0 |
| 中国标准时间 | China Standard Time | UTC+8 |
| 美国东部标准时间 | Eastern Standard Time | UTC-5(冬令时)/ UTC-4(夏令时) |
| 欧洲中部标准时间 | Central European Standard Time | UTC+1(冬令时)/ UTC+2(夏令时) |
注意事项
- 输入的时间值如果没有时区信息,必须先指定其对应的源时区,否则转换结果会不符合预期。
- AT TIME ZONE会自动处理夏令时和冬令时的切换,不需要手动计算时差调整。
- 如果输入的是
datetimeoffset类型的值,已经包含时区信息,可以直接使用AT TIME ZONE转换到目标时区,无需额外指定源时区。 - 如果指定的时区标识不存在,执行时会抛出错误,使用前可以通过
SELECT * FROM sys.time_zone_info查询数据库支持的所有时区。
直接转换datetimeoffset类型的示例
如果输入时间已经是带时区的datetimeoffset类型,转换逻辑更简单:
CREATE PROCEDURE dbo.Sp_Convert_Datetimeoffset
@input_offset_time DATETIMEOFFSET, -- 带时区的输入时间
@target_timezone NVARCHAR(50),
@result_time DATETIMEOFFSET OUTPUT
AS
BEGIN
SET NOCOUNT ON;
-- 直接转换到目标时区
SET @result_time = @input_offset_time AT TIME ZONE @target_timezone;
SELECT
@input_offset_time AS 输入带时区时间,
@target_timezone AS 目标时区,
@result_time AS 转换后时间;
END
GO
调用该存储过程的示例如下:
DECLARE @res DATETIMEOFFSET;
-- 输入带UTC时区的时间
EXEC dbo.Sp_Convert_Datetimeoffset
@input_offset_time = '2024-05-01 04:00:00 +00:00',
@target_timezone = 'China Standard Time',
@result_time = @res OUTPUT;
注意:不同数据库对AT TIME ZONE语法的支持情况不同,本文示例基于SQL Server,其他数据库如PostgreSQL也有类似的时区转换语法,但语法格式和时区标识可能存在差异,需要根据实际使用的数据库调整。
SQL存储过程AT_TIME_ZONE跨时区时间转换时区转换修改时间:2026-07-12 16:54:11