Jika Anda memiliki datetimeoffset nilai, tetapi Anda tidak memerlukan bagian offset waktu dan zona waktu, mengubahnya menjadi tanggal akan menghemat banyak ruang penyimpanan (sambil menghapus detail yang tidak perlu dari nilai). Artikel ini berisi contoh mengonversi datetimeoffset nilai untuk tanggal nilai di SQL Server.
offset datetime tipe data termasuk tanggal dan waktu dengan zona waktu offset. Ini juga memiliki bagian pecahan detik antara 0 dan 7 (ini tergantung pada berapa banyak pecahan detik yang ditetapkan untuk itu). Ini dilakukan dengan menggunakan datetimeoffset(n)
sintaksis. Jika Anda tidak menentukan ini, itu akan menggunakan 7 (default). Ukuran penyimpanan tipe data ini adalah 8, 9, atau 10 byte (ditambah 1 byte untuk menyimpan presisi), tergantung pada presisi yang digunakan. Akurasinya adalah 100 nanodetik.
Tanggal tipe data di sisi lain, hanya menyertakan tanggal. Itu tidak termasuk waktu, dan memiliki akurasi 1 hari. Ini menggunakan 3 byte untuk penyimpanan.
Saat Anda mengonversi datetimeoffset nilai untuk tanggal tipe data, Anda kehilangan bagian waktu (termasuk offset zona waktu). Namun, Anda juga mengurangi ukuran penyimpanan menjadi 3 byte tetap. Tentu saja, Anda hanya akan melakukan konversi ini jika Anda tidak memerlukan porsi waktu dan offset zona waktu.
Contoh 1 – Konversi Implisit
Berikut ini contoh konversi implisit antara datetimeoffset dan tanggal .
DECLARE @thedatetimeoffset datetimeoffset, @thedate date;SET @thedatetimeoffset ='2025-05-21 10:15:30.1234567 +10:30';SET @thedate =@thedatetimeoffset;SELECT @thedatetimeoffset SEBAGAI 'datetimeoffset', @thedate SEBAGAI 'tanggal';
Hasil:
+------------------------------------+--------- ---+| datetimeoffset | tanggal ||------------------------------------+---------- --|| 2025-05-21 10:15:30.1234567 +10:30 | 2025-05-21 |+------------------------------------+------ ------+
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 untuk tanggal variabel.
Di sini kita dapat melihat bahwa tanggal nilai hanya menyertakan tanggal (tanpa komponen waktu). Komponen waktu, termasuk offset zona waktunya, telah dihapus dari nilainya.
Dalam contoh ini, datetimeoffset nilai menggunakan presisi default (yang menghasilkan 7 tempat desimal). Ini menghasilkan tipe data yang menggunakan 10 byte (sebenarnya, 11 byte jika Anda menghitung byte tambahan yang menyimpan presisi). Tanggal nilai hanya menggunakan 3 byte.
Contoh 2 – 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 tanggal .
DECLARE @thedatetimeoffset datetimeoffset;SET @thedatetimeoffset ='2025-05-21 10:15:30.1234567 +10:30';PILIH @thedatetimeoffset SEBAGAI 'datetimeoffset', CAST(@thedatetimeoffset SEBAGAI tanggal) SEBAGAI 'tanggal';
Hasil:
+------------------------------------+--------- ---+| datetimeoffset | tanggal ||------------------------------------+---------- --|| 2025-05-21 10:15:30.1234567 +10:30 | 2025-05-21 |+------------------------------------+------ ------+
Contoh 3 – Konversi Eksplisit menggunakan CONVERT()
Berikut adalah contoh konversi eksplisit menggunakan CONVERT()
fungsi alih-alih CAST()
.
DECLARE @thedatetimeoffset datetimeoffset;SET @thedatetimeoffset ='2025-05-21 10:15:30.1234567 +10:30';PILIH @thedatetimeoffset SEBAGAI 'datetimeoffset', CONVERT(tanggal, @thedatetimeoffset) SEBAGAI 'tanggal';Hasil:
+------------------------------------+--------- ---+| datetimeoffset | tanggal ||------------------------------------+---------- --|| 2025-05-21 10:15:30.1234567 +10:30 | 2025-05-21 |+------------------------------------+------ ------+