Artikel ini berisi contoh konversi datetimeoffset nilai ke datetime di SQLServer.
Saat Anda mengonversi datetimeoffset nilai ke datetime , nilai tanggal dan waktu disalin, dan offset zona waktu terpotong. Ketika presisi fraksional dari datetimeoffset nilainya lebih besar dari tiga digit, nilainya terpotong.
offset datetime tipe data memungkinkan Anda untuk menentukan presisi pecahan detik dari 0 hingga 7. Hal ini dilakukan dengan menggunakan datetimeoffset(n)
sintaksis. Jika Anda tidak menentukan ini, itu akan menggunakan 7 (default). Ini juga memiliki offset zona waktu. Ukuran penyimpanan tipe data ini adalah 8, 9, atau 10 byte, tergantung pada presisi yang digunakan. Byte lain digunakan untuk menyimpan presisi sehingga ini menambahkan 1 byte ke angka tersebut.
waktu kencan tipe data, di sisi lain, memiliki maksimal 3 digit untuk bagian pecahan detiknya. Akurasinya dibulatkan ke peningkatan .000, .003, atau .007 detik. Tipe data ini tidak memiliki kesadaran zona waktu, dan oleh karena itu, tidak ada offset zona waktu. Ukuran penyimpanannya adalah 8 byte.
Contoh 1 – Konversi Implisit
Berikut adalah contoh konversi implisit antara datetimeoffset dan waktu kencan .
DECLARE @thedatetimeoffset datetimeoffset, @thedatetime datetime;SET @thedatetimeoffset ='2025-05-21 10:15:30.1234567 +07:00';SET @thedatetime =@thedatetimeoffset;PILIH @thedatetimeoffset SEBAGAI 'datetimeoffset', @thedatetime SEBAGAI 'datetime';
Hasil:
+------------------------------------+--------- ----------------+| datetimeoffset | datetime ||------------------------------------+---------- ---------------|| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.123 |+-----------------------------------+- ------------------------+
Ini adalah konversi implisit karena kami tidak menggunakan fungsi konversi (seperti yang di bawah ini) untuk mengonversinya secara eksplisit. Dalam hal ini, SQL Server melakukan konversi implisit di balik layar saat kami mencoba menetapkan datetimeoffset nilai ke datetime variabel.
Kita dapat melihat bahwa datetime variabel memiliki presisi pecahan detik yang lebih sedikit, dan kami berakhir dengan bagian pecahan 123 meskipun bagian pecahan aslinya adalah 1234567 .
Dalam hal ini, tidak ada pembulatan yang dilakukan.
Kami juga melihat bahwa offset zona waktu terpotong. waktu kencan tipe data tidak memiliki kesadaran zona waktu.
Dalam konversi ini, ukuran penyimpanan telah berkurang dari 10 byte (11 byte jika Anda menyertakan byte tambahan yang menyimpan presisi) untuk datetimeoffset , hingga 8 byte untuk datetime . Namun, jika datetimeoffset nilai telah menggunakan skala antara 0 dan 2, itu akan menggunakan hanya 8 byte (9 termasuk presisi).
Jika telah menggunakan skala 3 (setara dengan datetime nilai), ukuran penyimpanan akan menjadi 9 byte (10 dengan presisi). Namun, akurasinya akan lebih tinggi dari datetime . Tentu saja, akurasinya akan berkurang segera setelah kami mengonversinya ke datetime .
Contoh 2 – Presisi/Akurasi dan Pembulatan
waktu kencan tipe data dibulatkan menjadi kelipatan .000, .003, atau .007 detik. Bahkan jika Anda secara eksplisit mengaturnya ke nilai lain, itu akan dibulatkan.
Ini juga berlaku saat mengonversi dari tipe data lain (seperti yang kami lakukan di sini).
Berikut adalah contoh yang menunjukkan apa yang saya maksud.
DECLARE @thedatetimeoffset datetimeoffset, @thedatetime datetime;SET @thedatetimeoffset ='2025-05-21 10:15:30.1250000 +07:00';SET @thedatetime =@thedatetimeoffset;PILIH @thedatetimeoffset SEBAGAI 'datetimeoffset', @thedatetime SEBAGAI 'datetime';
Hasil:
+------------------------------------+--------- ----------------+| datetimeoffset | datetime ||------------------------------------+---------- ---------------|| 2025-05-21 10:15:30.1250000 +07:00 | 2025-05-21 10:15:30.127 |+-----------------------------------+- ------------------------+
Dalam contoh ini, saya menyetel pecahan detik dari datetimeoffset nilai ke 1250000
tapi waktu kencan dibulatkan menjadi
127
(karena hanya dapat dibulatkan menjadi kelipatan .000, .003, atau .007 detik).
Contoh 3 – Konversi Eksplisit menggunakan CAST()
Berikut ini contoh konversi eksplisit. Dalam hal ini, saya menggunakan CAST()
berfungsi langsung di dalam SELECT
pernyataan untuk secara eksplisit mengonversi antara datetimeoffset dan waktu kencan .
DECLARE @thedatetimeoffset datetimeoffset;SET @thedatetimeoffset ='2025-05-21 10:15:30.1234567 +07:00';PILIH @thedatetimeoffset AS 'datetimeoffset', CAST(@thedatetimeoffset AS datetime) SEBAGAI 'datetime';Hasil:
+------------------------------------+--------- ----------------+| datetimeoffset | datetime ||------------------------------------+---------- ---------------|| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.123 |+-----------------------------------+- ------------------------+Contoh 4 – Konversi Eksplisit menggunakan CONVERT()
Berikut adalah contoh konversi eksplisit menggunakan
CONVERT()
fungsi alih-alihCAST()
.DECLARE @thedatetimeoffset datetimeoffset;SET @thedatetimeoffset ='2025-05-21 10:15:30.1234567 +07:00';PILIH @thedatetimeoffset SEBAGAI 'datetimeoffset', CONVERT(datetime, @thedatetimeoffset) SEBAGAI 'datetime';Hasil:
+------------------------------------+--------- ----------------+| datetimeoffset | datetime ||------------------------------------+---------- ---------------|| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.123 |+-----------------------------------+- ------------------------+