PADA ZONA WAKTU (T-SQL)
Berlaku untuk: SQL Server 2016 (13.x) dan yang lebih baru Azure SQL Database Azure SQL Managed Instance Titik akhir analitik Azure Synapse Analytics SQL di Microsoft Fabric Warehouse 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.
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 .
Untuk informasi selengkapnya tentang zona waktu untuk SQL Server di Linux, lihat Mengonfigurasi zona waktu untuk SQL Server 2022 di Linux.
Jenis yang dikembalikan
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. 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 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;