PADA ZONA WAKTU (T-SQL)

Berlaku untuk: SQL Server 2016 (13.x) dan yang lebih baru Azure SQL DatabaseAzure SQL Managed InstanceTitik akhir analitik Azure Synapse AnalyticsSQL di Microsoft FabricWarehouse di Microsoft Fabric

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 , klausul AT TIME ZONE akan mengonversinya ke zona waktu target menggunakan aturan konversi zona waktu.

AT TIME ZONE implementasi bergantung pada mekanisme Windows untuk mengonversi nilai tanggalwaktu di seluruh zona waktu.

Konvensi sintaks transact-SQL

Sintaks

inputdate AT TIME ZONE timezone

Argumen

inputdate

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

zona waktu

Nama zona waktu tujuan. SQL Server bergantung pada zona waktu yang disimpan di Windows Registry. 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 ).

Untuk informasi selengkapnya tentang zona waktu untuk SQL Server di Linux, lihat Mengonfigurasi zona waktu untuk SQL Server 2022 di Linux.

Jenis Pengembalian

Mengembalikan jenis data datetimeoffset.

Nilai hasil

Nilai datetimeoffset di zona waktu target.

Keterangan

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.

Contoh

J. 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 AdventureWorks2022;
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 datetime 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 AdventureWorks2022;
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;

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

USE AdventureWorks2022;
GO

DECLARE @CustomerTimeZone 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;

C. Mengkueri tabel temporal menggunakan zona waktu tertentu

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

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