SET 时区(Transact-SQL)

适用于:Azure SQL 数据库Microsoft Fabric中的SQL数据库

SET TIME ZONE Transact-SQL(T-SQL)语句用于在Azure SQL 数据库中设置时区值,在Microsoft Fabric中设置SQL数据库。

注释

SET TIME ZONE不支持 SQL Server 或 Azure SQL 托管实例。

SET TIME ZONE 覆盖数据库或实例级时区值。 时区值与namesys.time_zone_info系统视图中的列相同。

Transact-SQL 语法约定

Syntax

SET TIME ZONE { 'time_zone_value' | 'LOCAL' }
[ ; ]

Arguments

{ 'time_zone_value' |'本地' }

指定时区值。 time_zone_value 是 nvarchar(128),默认为 LOCAL。

如果 LOCAL 指定了,则会话当前默认时区值将设置为会话的原始时区值,这可以是数据库范围选项或实例默认值。

通过 sys.time_zone_info 系统视图,会显示已安装的时区列表。

Remarks

如果 SET TIME ZONE 被用于 T-SQL 模块或动态 SQL 批处理,则变更仅适用于模块或动态 SQL 批处理的执行范围。 模块或动态SQL批处理完成后,会话时区设置会恢复为模块或动态SQL批处理执行前生效的时区值。

Permissions

需要 公共 固定数据库角色的成员身份。

Examples

本文中的代码示例使用AdventureWorks2025了 、 AdventureWorksDW2025或AdventureWorksLT2025示例数据库,您可以从 Azure Data SQL Samples Repository 的 GitHub 仓库下载。

A. 查看当前时区设置

以下查询返回服务器名称、数据库名称和产品版本。

SELECT @@servername AS ServerName,
       DB_NAME() AS DatabaseName,
       SERVERPROPERTY('ResourceVersion') AS ProductVersion;

以下查询列出了有效的时区,按UTC偏移量排序。

SELECT *
FROM sys.time_zone_info
ORDER BY current_utc_offset;

以下查询检查数据库范围配置的 TIME_ZONE 当前值。

SELECT *
FROM sys.database_scoped_configurations
WHERE name = 'TIME_ZONE';

如果数据库层面没有设置时区,它默认是实例时区。 实例时区设置取决于平台:

平台 Description
Windows操作系统 底层操作系统的时区。
Linux 这是SQL Server进程的时区,你可以用TZ环境变量设置。
Azure SQL 数据库 SQL实例的时区,始终是UTC,今天不能更改。
Azure SQL 托管实例 SQL实例的时区默认为UTC,且仅在实例创建时今天才能修改。

B. 将时区设置在数据库层面

以下示例将数据库范围的时区设置为新西兰标准时间,然后回顾受影响的功能。

ALTER DATABASE SCOPED CONFIGURATION SET TIME_ZONE = 'New Zealand Standard Time';
GO

SELECT CURRENT_TIMEZONE() AS CurrentTimeZone,
       CURRENT_TIMEZONE_ID() AS CurrentTimeZoneId,
       SYSDATETIMEOFFSET() AS CurrentDateTimeOffset,
       SYSDATETIME() AS CurrentLocalDateTime2,
       GETDATE() AS CurrentLocalDateTime3,
       CURRENT_TIMESTAMP AS CurrentLocalDateTime4;

C. 将数据库范围的时区重置为默认值

以下示例将数据库范围的时区恢复为 LOCAL,然后回顾受影响的函数。

ALTER DATABASE SCOPED CONFIGURATION SET TIME_ZONE = LOCAL;
GO

SELECT CURRENT_TIMEZONE() AS CurrentTimeZone,
       CURRENT_TIMEZONE_ID() AS CurrentTimeZoneId,
       SYSDATETIMEOFFSET() AS CurrentDateTimeOffset,
       SYSDATETIME() AS CurrentLocalDateTime2,
       GETDATE() AS CurrentLocalDateTime,
       CURRENT_TIMESTAMP AS CurrentLocalDateTime2;

D. 在会话层级设置时区

以下示例将会话时区设置为太平洋标准时间,再设置为印度标准时间,并在每次变更后审查受影响的功能。

SET TIME ZONE 'Pacific Standard Time';

SELECT CURRENT_TIMEZONE() AS CurrentTimeZone, CURRENT_TIMEZONE_ID() AS CurrentTimeZoneId,
       SYSDATETIMEOFFSET() AS CurrentDateTimeOffset, SYSDATETIME() AS CurrentLocalDateTime2,
       GETDATE() AS CurrentLocalDateTime3, CURRENT_TIMESTAMP AS CurrentLocalDateTime4;
GO

SET TIME ZONE 'India Standard Time';

SELECT CURRENT_TIMEZONE() AS CurrentTimeZone, CURRENT_TIMEZONE_ID() AS CurrentTimeZoneId,
       SYSDATETIMEOFFSET() AS CurrentDateTimeOffset, SYSDATETIME() AS CurrentLocalDateTime2,
       GETDATE() AS CurrentLocalDateTime3, CURRENT_TIMESTAMP AS CurrentLocalDateTime4;

E. 将会话时区重置为默认

以下示例将会话重置为实例或平台默认时区。

SET TIME ZONE local;
GO

SELECT CURRENT_TIMEZONE() AS CurrentTimeZone,
       CURRENT_TIMEZONE_ID() AS CurrentTimeZoneId,
       SYSDATETIMEOFFSET() AS CurrentDateTimeOffset,
       SYSDATETIME() AS CurrentLocalDateTime2,
       GETDATE() AS CurrentLocalDateTime3,
       CURRENT_TIMESTAMP AS CurrentLocalDateTime4;

F. 系统视图总是返回实例时区

包含时间值的系统视图总是返回实例时区,无论会话或数据库时区如何。

SELECT *
FROM sys.dm_exec_sessions;

SELECT *
FROM sys.dm_exec_query_stats;

SELECT *
FROM sys.objects;