AT TIME ZONE
klausa diperkenalkan di SQL Server 2016 untuk mengonversi tanggal menjadi datetimeoffset nilai dalam zona waktu target.
Fungsi ini mirip dengan beberapa fungsi T-SQL lainnya, seperti SWITCHOFFSET()
dan TODATETIMEOFFSET()
, namun, AT TIME ZONE
klausa memungkinkan/(memerlukan) Anda untuk menentukan zona waktu offset dengan nama, bukan nilai offset yang sebenarnya.
Artikel ini membahas bagaimana AT TIME ZONE
bekerja, dan menjelaskan manfaatnya jika dibandingkan dengan fungsi lain yang disebutkan.
Contoh Penggunaan
Berikut adalah contoh dasar bagaimana AT TIME ZONE
klausa berfungsi.
DECLARE @dto datetimeoffset = '2020-04-01 00:00:00.0000000 +00:00';
SELECT
@dto AS [Original],
@dto AT TIME ZONE 'New Zealand Standard Time' AS [NZ Time];
Hasil (menggunakan keluaran vertikal):
Original | 2020-04-01 00:00:00.0000000 +00:00 NZ Time | 2020-04-01 13:00:00.0000000 +13:00
Anda mungkin bertanya-tanya mengapa Microsoft bahkan memperkenalkan fitur ini padahal Anda bisa menggunakan SWITCHOFFSET()
berfungsi untuk melakukan hal yang sama?
Nah, Anda tidak bisa sebenarnya melakukan hal yang sama persis dengan SWITCHOFFSET()
.
Dengan SWITCHOFFSET()
, Anda harus memberikan offset zona waktu aktual dalam format [+|-]TZH:TZM atau sebagai bilangan bulat bertanda (untuk menit). Ini berarti Anda perlu mengetahui offset zona waktu yang tepat, dan apakah zona waktu tersebut sedang mengamati musim panas atau tidak.
Dengan AT TIME ZONE
klausa, Anda tidak perlu tahu itu. Yang perlu Anda ketahui hanyalah nama zona waktu (dan inilah cara mendapatkan nama zona waktu).
Contoh Musim Panas
Berikut adalah contoh yang menunjukkan manfaat menggunakan AT TIME ZONE
sehubungan dengan penghematan siang hari.
DECLARE @dto1 datetimeoffset, @dto2 datetimeoffset;
SET @dto1 = '2020-04-01 00:00:00.0000000 +00:00';
SET @dto2 = '2020-04-07 00:00:00.0000000 +00:00';
SELECT
@dto1 AS [@dto1],
@dto2 AS [@dto2],
@dto1 AT TIME ZONE 'New Zealand Standard Time' AS [NZ Time: @dto1],
@dto2 AT TIME ZONE 'New Zealand Standard Time' AS [NZ Time: @dto2];
Hasil (menggunakan keluaran vertikal):
@dto1 | 2020-04-01 00:00:00.0000000 +00:00 @dto2 | 2020-04-07 00:00:00.0000000 +00:00 NZ Time: @dto1 | 2020-04-01 13:00:00.0000000 +13:00 NZ Time: @dto2 | 2020-04-07 12:00:00.0000000 +12:00
Di Selandia Baru, musim panas berakhir pada tanggal 5 Maret 2020. Oleh karena itu dalam contoh ini saya menggunakan dua tanggal (1 Maret dan 7 Maret).
Saat saya mengubahnya menjadi 'Waktu Standar Selandia Baru', AT TIME ZONE
secara otomatis memasukkan penghematan siang hari dalam perhitungannya dan mengembalikan tanggal/waktu yang berlaku.
Jadi kita dapat melihat bahwa tanggal 1 Maret menggunakan offset zona waktu +13:00 dan tanggal 7 Maret menggunakan +12:00 (karena musim panas berakhir pada tanggal 5 Maret).
Jika saya menggunakan SWITCHOFFSET()
Saya harus tahu offset zona waktu mana yang akan digunakan untuk setiap tanggal.
DECLARE @dto1 datetimeoffset, @dto2 datetimeoffset;
SET @dto1 = '2020-04-01 00:00:00.0000000 +00:00';
SET @dto2 = '2020-04-07 00:00:00.0000000 +00:00';
SELECT
@dto1 AS [@dto1],
@dto2 AS [@dto2],
SWITCHOFFSET(@dto1, '+12:00') AS [+12:00],
SWITCHOFFSET(@dto2, '+13:00') AS [+13:00];
Hasil (menggunakan keluaran vertikal):
@dto1 | 2020-04-01 00:00:00.0000000 +00:00 @dto2 | 2020-04-07 00:00:00.0000000 +00:00 +12:00 | 2020-04-01 12:00:00.0000000 +12:00 +13:00 | 2020-04-07 13:00:00.0000000 +13:00
Mengonversi Dari Tanggal Tanpa Offset Zona Waktu
Anda juga dapat menggunakan AT TIME ZONE
pada tanggal tanpa offset zona waktu. Faktanya, fungsi menerima ekspresi apa pun yang dapat diselesaikan ke waktu kecil , waktu tanggal , datetime2 , atau datetimeoffset nilai.
Namun, ketika Anda melakukan ini, Anda harus memperhatikan bagaimana hasilnya dihitung. Ketika tanggal diberikan tanpa informasi offset, fungsi menerapkan offset zona waktu dengan asumsi bahwa tanggal input berada di zona waktu target.
DECLARE @dt1 smalldatetime, @dt2 smalldatetime;
SET @dt1 = '2020-04-01 00:00:00';
SET @dt2 = '2020-04-07 00:00:00';
SELECT
@dt1 AS [@dt1],
@dt2 AS [@dt2],
@dt1 AT TIME ZONE 'New Zealand Standard Time' AS [NZ Time: @dt1],
@dt2 AT TIME ZONE 'New Zealand Standard Time' AS [NZ Time: @dt2];
Hasil:
@dt1 | 2020-04-01 00:00:00 @dt2 | 2020-04-07 00:00:00 NZ Time: @dt1 | 2020-04-01 00:00:00.0000000 +13:00 NZ Time: @dt2 | 2020-04-07 00:00:00.0000000 +12:00
Perhatikan bahwa meskipun offset zona waktu diterapkan seperti yang ditentukan, ini tidak memengaruhi tanggal/waktu. Kedua tanggal/waktu yang dihasilkan memiliki nilai yang sama – hanya offset zona waktu yang berubah.
Jika ini bukan yang Anda inginkan, Anda dapat menambahkan AT TIME ZONE 'UTC'
ke campuran untuk terlebih dahulu mengonversi tanggal asli ke UTC, sebelum dikonversi ke zona waktu yang diinginkan.
DECLARE @dt1 smalldatetime, @dt2 smalldatetime;
SET @dt1 = '2020-04-01 00:00:00';
SET @dt2 = '2020-04-07 00:00:00';
SELECT
@dt1 AS [@dt1],
@dt2 AS [@dt2],
@dt1 AT TIME ZONE 'UTC' AT TIME ZONE 'New Zealand Standard Time' AS [NZ Time: @dt1],
@dt2 AT TIME ZONE 'UTC' AT TIME ZONE 'New Zealand Standard Time' AS [NZ Time: @dt2];
Hasil:
@dt1 | 2020-04-01 00:00:00 @dt2 | 2020-04-07 00:00:00 NZ Time: @dt1 | 2020-04-01 13:00:00.0000000 +13:00 NZ Time: @dt2 | 2020-04-07 12:00:00.0000000 +12:00