Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Berlaku untuk: SQL Server 2016 (13.x) dan versi yang
lebih baru Azure SQL Database
Azure SQL Managed Instance
Titik akhir analitik SQL
Azure Synapse Analytics di Microsoft Fabric
Warehouse dalam database Microsoft Fabric
SQL 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.
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:00Ketika 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