PADA ZONA WAKTU (T-SQL)

Berlaku untuk: SQL Server 2016 (13.x) dan versi yang lebih baru Azure SQL DatabaseAzure SQL Managed InstanceTitik akhir analitik SQLAzure Synapse Analytics di Microsoft Fabric Warehouse dalam database Microsoft FabricSQL di Microsoft Fabric

Pernyataan AT TIME ZONE Transact-SQL (T-SQL) mengonversi input_date ke nilai datetimeoffset yang sesuai di zona waktu target. Ketika input_date diberikan tanpa informasi offset, fungsi menerapkan offset zona waktu dengan asumsi input_date berada di zona waktu target.

Jika input_date disediakan sebagai nilai datetimeoffset , maka AT TIME ZONE klausa mengubahnya menjadi zona waktu target menggunakan aturan konversi zona waktu.

Implementasi ini AT TIME ZONE bergantung pada mekanisme Windows untuk mengonversi nilai datetime lintas zona waktu.

Konvensi sintaks transact-SQL

Syntax

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

Arguments

input_date

Ekspresi yang dapat diatasi ke nilai smalldatetime, datetime, datetime2, atau datetimeoffset .

'time_zone_value'

Nama zona waktu tujuan. time_zone_value adalah nvarchar(128).

SQL Server bergantung pada zona waktu yang disimpan di Windows Registry. Zona waktu yang diinstal pada komputer disimpan di sarang registri berikut: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones.

Daftar zona waktu yang terpasang juga ditampilkan melalui tampilan sistem sys.time_zone_info .

Untuk informasi selengkapnya tentang zona waktu untuk SQL Server di Linux, lihat Mengonfigurasi zona waktu untuk SQL Server 2022 dan versi yang lebih baru di Linux.

{ 'time_zone_value' | 'LOKAL' }

Nama zona waktu tujuan. time_zone_value adalah nvarchar(128), dengan default .LOCAL

Daftar zona waktu yang terpasang ditampilkan melalui tampilan sistem sys.time_zone_info .

Jika LOCAL ditentukan, maka nilai zona waktu default saat ini dari sesi diatur ke nilai zona waktu asli sesi, yang dapat berupa opsi cakupan database atau default instance.

Tipe pengembalian

Mengembalikan jenis data datetimeoffset.

Mengembalikan nilai

Nilai datetimeoffset di zona waktu target.

Remarks

AT TIME ZONE menerapkan aturan tertentu untuk mengonversi nilai input dalam jenis data smalldatetime, datetime, dan datetime2 yang termasuk dalam interval yang dipengaruhi oleh perubahan DST:

  • Ketika jam diatur ke depan, ada kesenjangan 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 berada 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 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
    
  • Ketika jam diatur kembali, maka 2 jam waktu lokal 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 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
    

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

Meskipun datetimeoffset tidak didukung di pergudangan data di Microsoft Fabric, AT TIME ZONE masih dapat digunakan dengan datetime2, seperti dalam contoh berikut.

Examples

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

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

USE AdventureWorks2025;
GO

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

Berikut adalah kumpulan hasilnya.

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. Mengonversi nilai di antara zona waktu yang berbeda

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

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;

Berikut adalah kumpulan hasilnya.

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
...

Anda juga dapat mengganti dalam variabel lokal yang berisi zona waktu:

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;

Berikut adalah kumpulan hasilnya.

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. Mengkueri tabel temporal menggunakan zona waktu tertentu

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

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;

Berikut adalah kumpulan hasilnya.

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