ZONA WAKTU (Transact-SQL)

Berlaku untuk:yes SQL Server 2016 (13.x) dan yang lebih baru YesAzure SQL Database YesAzure SQL Managed Instance yesAzure Synapse Analytics

Mengonversi inputdate ke nilai datetimeoffset yang sesuai di zona waktu target. Ketika inputdate disediakan tanpa informasi offset, fungsi menerapkan offset zona waktu dengan asumsi bahwa inputdate berada di zona waktu target. Jika inputdate disediakan sebagai nilai datetimeoffset , klausa AT TIME ZONE mengonversinya menjadi zona waktu target menggunakan aturan konversi zona waktu.

Implementasi ZONA WAKTU bergantung pada mekanisme Windows untuk mengonversi nilai tanggalwaktu di seluruh zona waktu.

Topic link iconKonvensi Sintaksis T-SQL

Sintaks

inputdate AT TIME ZONE timezone  

Argumen

inputdate
Adalah ekspresi yang dapat diselesaikan ke nilai smalldatetime, datetime, datetime2, atau datetimeoffset .

zona waktu Nama zona waktu tujuan. SQL Server bergantung pada zona waktu yang disimpan di Registri Windows. Zona waktu yang diinstal pada komputer disimpan di sarang registri berikut: KEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones. Daftar zona waktu yang diinstal juga diekspos melalui tampilan sys.time_zone_info (Transact-SQL ).

Jenis Kembalian

Mengembalikan jenis data datetimeoffset.

Tampilkan Nilai

Nilai datetimeoffset di zona waktu target.

Keterangan

ZONA WAKTU menerapkan aturan khusus untuk mengonversi nilai input dalam jenis data smalldatetime, datetime, dan datetime2 yang termasuk dalam interval yang dipengaruhi oleh perubahan DST:

  • Ketika jam diatur di depan, ada celah dalam waktu lokal yang sama dengan durasi penyesuaian jam. Durasi ini biasanya 1 jam, tetapi bisa 30 atau 45 menit, tergantung pada zona waktu. Titik waktu yang ada dalam celah ini dikonversi dengan offset setelah perubahan DST.

    /*  
        Moving to DST in "Central European Standard Time" zone: 
        offset changes from +01:00 -> +02:00   
        Change occurred on March 29th, 2015 at 02:00:00.   
        Adjusted local time became 2015-03-29 03:00:00.  
    */  
    
    --Time before DST change has standard time offset (+01:00)
    SELECT CONVERT(DATETIME2(0), '2015-03-29T01:01:00', 126)     
    AT TIME ZONE 'Central European Standard Time';  
    --Result: 2015-03-29 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), '2015-03-29T02:01:00', 126)   
    AT TIME ZONE 'Central European Standard Time';  
    --Result: 2015-03-29 03:01:00 +02:00
    
    --Time after 03:00 is presented with the summer time offset (+02:00)
    SELECT CONVERT(DATETIME2(0), '2015-03-29T03:01:00', 126)   
    AT TIME ZONE 'Central European Standard Time';  
    --Result: 2015-03-29 03:01:00 +02:00  
    
    
  • Ketika jam diatur kembali, maka 2 jam waktu setempat tumpang tindih ke satu jam. Dalam hal ini, titik waktu yang termasuk dalam interval tumpang tindih disajikan dengan offset sebelum jam berubah:

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

Karena beberapa informasi (seperti aturan zona waktu) dipertahankan di luar SQL Server dan dapat berubah sesekali, fungsi AT TIME ZONE diklasifikasikan sebagai nondeterministik.

Contoh

A. Menambahkan offset zona waktu target ke datetime tanpa informasi offset

Gunakan AT TIME ZONE untuk menambahkan offset berdasarkan aturan zona waktu saat Anda mengetahui bahwa nilai tanggalwaktu asli disediakan di zona waktu yang sama:

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

B. Mengonversi nilai di antara zona waktu yang berbeda

Contoh berikut mengonversi nilai di antara zona waktu yang berbeda. Nilai inputdate adalah tanggalwaktu dan tidak disimpan dengan offset, tetapi diketahui sebagai Waktu Standar Pasifik. Langkah pertama adalah menetapkan offset yang diketahui dan kemudian mengonversi ke zona waktu baru:

USE AdventureWorks2016;
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;

C. Mengkueri Tabel Temporal menggunakan zona waktu tertentu

Contoh berikut memilih data dari tabel temporal menggunakan Waktu Standar Pasifik.

USE AdventureWorks2016;
GO

DECLARE @ASOF 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 BusinessEntityID, PersonType, NameStyle, Title,
    FirstName, MiddleName,
    ValidFrom AT TIME ZONE 'Pacific Standard Time'
FROM  Person.Person_Temporal
FOR SYSTEM_TIME AS OF @ASOF;

Langkah berikutnya