SAAT DILIMINDE (Transact-SQL)

Şunlar için geçerlidir: SQL Server 2016 (13.x) ve sonraki sürümleri Azure SQL VeritabanıAzure SQL Yönetilen ÖrneğiAzure Synapse AnalyticsSQL analiz uç noktası Microsoft Fabric'teki Microsoft FabricSQL veritabanında Microsoft Fabric'te

Transact-SQL (T-SQL) ifadesi, AT TIME ZONEbir input_date'yi hedef saat dilindeki ilgili datetimeoffset değerine dönüştürür. input_date ofset bilgisi olmadan sağlandığında, fonksiyon saat diliminin ofsetini uygular, input_date hedef saat diliminde olduğunu varsayır.

Eğer input_datedatetimeoffset değeri olarak sağlanırsa, AT TIME ZONE madde onu saat dilimi dönüşüm kuralları kullanılarak hedef zaman dilimine dönüştürür.

Uygulama, AT TIME ZONEtarih/saat değerlerini zaman dilimleri arasında dönüştürmek için Windows mekanizmasına dayanır.

Transact-SQL söz dizimi kuralları

Syntax

input_date AT TIME ZONE time_zone_value
input_date AT TIME ZONE { 'time_zone_value' | 'LOCAL' }

Arguments

input_date

Smalldatetime, datetime, datetime2 veya datetimeoffset değerine çözümlenebilen ifade.

'time_zone_value'

Hedef saat diliminin adı. time_zone_valuenvarchar(128)'dir.

SQL Server, Windows Kayıt Defteri'nde depolanan saat dilimlerini kullanır. Bilgisayarda yüklü olan saat dilimleri aşağıdaki kayıt defteri kovanında depolanır: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones.

Kurulu saat dilimlerinin listesi de sys.time_zone_info sistem görünümü üzerinden görünür.

Linux üzerinde SQL Server saat dilimleri hakkında daha fazla bilgi için bkz. Linux'ta SQL Server 2022 ve sonraki sürümleri için saat dilimini yapılandırma.

{ 'time_zone_value' | 'YEREL' }

Hedef saat diliminin adı. time_zone_valuenvarchar(128)'dir ve varsayılan olarak ' LOCALdir.

Kurulu saat dilimlerinin listesi sys.time_zone_info sistem görünümü üzerinden görünür.

Belirtilmişse LOCAL , mevcut oturum varsayılan zaman dilimi değeri oturumun orijinal zaman bölgesi değerine ayarlanır; bu da veritabanı kapsamlı seçenek veya örnek varsayılan olabilir.

Dönüş türleri

datetimeoffset veri türünü döndürür.

Dönüş değeri

Hedef saat dilimindeki datetimeoffset değeri.

Remarks

AT TIME ZONE bir DST değişikliğinden etkilenen bir aralığa giren smalldatetime, datetime ve datetime2 veri türlerindeki giriş değerlerini dönüştürmek için belirli kurallar uygular:

  • Saat önceden ayarlandığında, yerel saatte saat ayarlama süresine eşit bir boşluk olur. Bu süre genellikle 1 saattir, ancak saat dilimine bağlı olarak 30 veya 45 dakika olabilir. Bu boşluktaki zaman noktaları, DST değişikliğinden sonra uzaklık ile dönüştürülür.

    /*
      Moving to DST in "Central European Standard Time" zone:
      offset changes from +01:00 -> +02:00
      Change occurred on March 27th, 2022 at 02:00:00.
      Adjusted local time became 2022-03-27 03:00:00.
    */
    
    --Time before DST change has standard time offset (+01:00)
    SELECT CONVERT (DATETIME2 (0), '2022-03-27T01:01:00', 126)
        AT TIME ZONE 'Central European Standard Time';
    
    --Result: 2022-03-27 01:01:00 +01:00
    /*
      Adjusted time from the "gap interval" (between 02:00 and 03:00)
      is moved 1 hour ahead and presented with the summer time offset
      (after the DST change)
    */
    SELECT CONVERT (DATETIME2 (0), '2022-03-27T02:01:00', 126)
        AT TIME ZONE 'Central European Standard Time';
    
    --Result: 2022-03-27 03:01:00 +02:00
    
    --Time after 03:00 is presented with the summer time offset (+02:00)
    SELECT CONVERT (DATETIME2 (0), '2022-03-27T03:01:00', 126)
        AT TIME ZONE 'Central European Standard Time';
    
    --Result: 2022-03-27 03:01:00 +02:00
    
  • Saat geri ayarlandığında, 2 saatlik yerel saat bir saatle çakışıyor. Bu durumda, çakışan zaman aralığına ait olan zaman noktaları, saat değişmeden önce uzaklık ile birlikte sunulur:

    /*
        Moving back from DST to standard time in
        "Central European Standard Time" zone:
        offset changes from +02:00 -> +01:00.
        Change occurred on October 30th, 2022 at 03:00:00.
        Adjusted local time became 2022-10-30 02:00:00
    */
    
    --Time before the change has DST offset (+02:00)
    SELECT CONVERT (DATETIME2 (0), '2022-10-30T01:01:00', 126)
        AT TIME ZONE 'Central European Standard Time';
    
    --Result: 2022-10-30 01:01:00 +02:00
    /*
      Time from the "overlapped interval" is presented with DST offset (before the change)
    */
    SELECT CONVERT (DATETIME2 (0), '2022-10-30T02:00:00', 126)
        AT TIME ZONE 'Central European Standard Time';
    
    --Result: 2022-10-30 02:00:00 +02:00
    
    --Time after 03:00 is regularly presented with the standard time offset (+01:00)
    SELECT CONVERT (DATETIME2 (0), '2022-10-30T03:01:00', 126)
        AT TIME ZONE 'Central European Standard Time';
    
    --Result: 2022-10-30 03:01:00 +01:00
    

Bazı bilgiler (saat dilimi kuralları gibi) SQL Server dışında tutuldığından ve zaman zaman değişikliğe tabi olduğundan, AT TIME ZONE işlev belirsiz olarak sınıflandırılır.

Microsoft Fabric'te veri ambarında datetimeoffset desteklenmese de, AT TIME ZONE aşağıdaki örnekte olduğu gibi datetime2 ile kullanılabilir.

Examples

A. Uzaklık bilgisi olmadan tarih saatine hedef saat dilimi uzaklığı ekleme

Özgün AT TIME ZONE değerlerinin aynı saat diliminde sağlandığını bildiğinizde saat dilimi kurallarına göre uzaklık eklemek için kullanın:

USE AdventureWorks2025;
GO

SELECT SalesOrderID,
       OrderDate,
       OrderDate AT TIME ZONE 'Pacific Standard Time' AS OrderDate_TimeZonePST
FROM Sales.SalesOrderHeader;

Sonuç kümesi aşağıdadır.

SalesOrderID OrderDate               OrderDate_TimeZonePST
------------ ----------------------- -------------------------------
43659        2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00
43660        2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00
43661        2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00
43662        2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00
43663        2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00
43664        2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00
...

B. Değerleri farklı saat dilimleri arasında dönüştürme

Aşağıdaki örnek, değerleri farklı saat dilimleri arasında dönüştürür. OrderDate Değerler datetime değeridir ve uzaklık ile depolanmaz, ancak Pasifik Standart Saati olarak bilinir. İlk adım, bilinen uzaklığı atamak ve ardından yeni saat dilimine dönüştürmektir:

USE AdventureWorks2025;
GO

SELECT SalesOrderID,
       OrderDate,
       --Assign the known offset only
       OrderDate AT TIME ZONE 'Pacific Standard Time' AS OrderDate_TimeZonePST,
       --Assign the known offset, then convert to another time zone
       OrderDate AT TIME ZONE 'Pacific Standard Time' AT TIME ZONE 'Central European Standard Time' AS OrderDate_TimeZoneCET
FROM Sales.SalesOrderHeader;

Sonuç kümesi aşağıdadır.

SalesOrderID OrderDate               OrderDate_TimeZonePST          OrderDate_TimeZoneCET
------------ ----------------------- ------------------------------ -------------------------------
43659        2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00 2022-05-30 09:00:00.000 +02:00
43660        2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00 2022-05-30 09:00:00.000 +02:00
43661        2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00 2022-05-30 09:00:00.000 +02:00
43662        2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00 2022-05-30 09:00:00.000 +02:00
43663        2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00 2022-05-30 09:00:00.000 +02:00
43664        2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00 2022-05-30 09:00:00.000 +02:00
...

Saat dilimini içeren bir yerel değişkenle de değiştirebilirsiniz:

USE AdventureWorks2025;
GO

DECLARE @CustomerTimeZone AS NVARCHAR (128) = 'Central European Standard Time';

SELECT SalesOrderID,
       OrderDate,
       --Assign the known offset only
       OrderDate AT TIME ZONE 'Pacific Standard Time' AS OrderDate_TimeZonePST,
       --Assign the known offset, then convert to another time zone
       OrderDate AT TIME ZONE 'Pacific Standard Time' AT TIME ZONE @CustomerTimeZone AS OrderDate_TimeZoneCustomer
FROM Sales.SalesOrderHeader;

Sonuç kümesi aşağıdadır.

SalesOrderID OrderDate               OrderDate_TimeZonePST          OrderDate_TimeZoneCustomer
------------ ----------------------- ------------------------------ -------------------------------
43659        2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00 2022-05-30 09:00:00.000 +02:00
43660        2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00 2022-05-30 09:00:00.000 +02:00
43661        2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00 2022-05-30 09:00:00.000 +02:00
43662        2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00 2022-05-30 09:00:00.000 +02:00
43663        2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00 2022-05-30 09:00:00.000 +02:00
43664        2022-05-30 00:00:00.000 2022-05-30 00:00:00.000 -07:00 2022-05-30 09:00:00.000 +02:00
...

C. Belirli bir saat dilimini kullanarak zamansal tabloları sorgulama

Aşağıdaki örnek, Pasifik Standart Zamanı kullanılarak zaman tablosundan WideWorldImporters veri seçmektedir.

USE WideWorldImporters;
GO

DECLARE @ASOF AS DATETIMEOFFSET;
SET @ASOF = DATEADD(MONTH, -1, GETDATE()) AT TIME ZONE 'UTC';

-- Query state of the table a month ago projecting period
-- columns as Pacific Standard Time
SELECT CustomerID,
       CustomerName,
       ValidFrom AT TIME ZONE 'Pacific Standard Time'
FROM Sales.Customers FOR SYSTEM_TIME AS OF @ASOF;

Sonuç kümesi aşağıdadır.

CustomerID CustomerName                        ValidFrom
---------- ----------------------------------- ----------------------------------
1          Tailspin Toys (Head Office)         2013-01-01 00:00:00.0000000 -08:00
2          Tailspin Toys (Sylvanite, MT)       2013-01-01 00:00:00.0000000 -08:00
3          Tailspin Toys (Peeples Valley, AZ)  2013-01-01 00:00:00.0000000 -08:00
4          Tailspin Toys (Medicine Lodge, KS)  2013-01-01 00:00:00.0000000 -08:00
5          Tailspin Toys (Gasport, NY)         2013-01-01 00:00:00.0000000 -08:00
6          Tailspin Toys (Jessie, ND)          2013-01-01 00:00:00.0000000 -08:00