Mungkin ada sangat sedikit kasus penggunaan yang menyebabkan Anda mengonversi datetime2 nilai ke datetime di SQLServer. Khususnya, datetime2 tipe data dapat disetel untuk menggunakan ukuran penyimpanan yang sama dengan datetime , tetapi dengan presisi yang lebih tinggi. Jadi, dalam kebanyakan kasus, Anda akan lebih baik menggunakan datetime2 dibandingkan dengan waktu kencan . Microsoft juga merekomendasikan penggunaan datetime2 alih-alih waktu tanggal .
Namun, jika Anda berada dalam situasi di mana Anda perlu melakukan konversi ini, artikel ini berisi beberapa contoh dan pertimbangan yang mungkin dapat membantu.
Saat Anda mengonversi datetime2 nilai ke datetime , nilai yang dihasilkan akan bergantung pada pecahan detik yang ditetapkan ke datetime2 nilai, serta ketepatannya.
datetime2 tipe data memungkinkan Anda untuk menentukan presisi pecahan detik dari 0 hingga 7. Jika Anda tidak menentukan ini, itu akan menggunakan 7 (default).
waktu kencan tipe data di sisi lain, memiliki maksimal 3 digit untuk bagian pecahan detik. Akurasinya dibulatkan menjadi .000, .003, atau .007 detik.
Oleh karena itu, jika datetime2 menggunakan skala 3, nilai yang dihasilkan akan sangat mendekati (jika tidak identik) dengan nilai aslinya. Namun, karena akurasi datetime . yang lebih rendah , hasilnya bisa berbeda, karena pembulatan yang dilakukan.
Contoh 1 – Konversi Implisit
Berikut adalah contoh konversi implisit antara datetime2 dan waktu kencan .
DECLARE @thedatetime2 datetime2, @thedatetime datetime; SET @thedatetime2 = '2025-05-21 10:15:30.1234567'; SET @thedatetime = @thedatetime2; SELECT @thedatetime2 AS 'datetime2', @thedatetime AS 'datetime';
Hasil:
+-----------------------------+-------------------------+ | datetime2 | datetime | |-----------------------------+-------------------------| | 2025-05-21 10:15:30.1234567 | 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 datetime2 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.
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 @thedatetime2 datetime2, @thedatetime datetime; SET @thedatetime2 = '2025-05-21 10:15:30.1256789'; SET @thedatetime = @thedatetime2; SELECT @thedatetime2 AS 'datetime2', @thedatetime AS 'datetime';
Hasil:
+-----------------------------+-------------------------+ | datetime2 | datetime | |-----------------------------+-------------------------| | 2025-05-21 10:15:30.1256789 | 2025-05-21 10:15:30.127 | +-----------------------------+-------------------------+
Dalam contoh ini, saya mengatur pecahan detik dari datetime2 nilai ke 1256789
tapi waktu kencan dibulatkan menjadi
127
(karena hanya dapat dibulatkan menjadi kelipatan .000, .003, atau .007 detik).
Penting untuk dicatat bahwa ini akan tetap benar, meskipun kita hanya menetapkan 3 detik pecahan ke datetime2 nilai.
Contoh:
DECLARE @thedatetime2 datetime2(3), @thedatetime datetime; SET @thedatetime2 = '2025-05-21 10:15:30.125'; SET @thedatetime = @thedatetime2; SELECT @thedatetime2 AS 'datetime2', @thedatetime AS 'datetime';
Hasil:
+-------------------------+-------------------------+ | datetime2 | datetime | |-------------------------+-------------------------| | 2025-05-21 10:15:30.125 | 2025-05-21 10:15:30.127 | +-------------------------+-------------------------+
Penting juga untuk mewaspadai setiap pembulatan yang mungkin terjadi pada datetime2 yang asli nilai. datetime2 nilai itu sendiri dapat dibulatkan ke atas jika kita mencoba menetapkan nilai dengan lebih banyak pecahan detik daripada skalanya sendiri.
Contoh:
DECLARE @thedatetime2 datetime2(3), @thedatetime datetime; SET @thedatetime2 = '2025-05-21 10:15:30.1256789'; SET @thedatetime = @thedatetime2; SELECT @thedatetime2 AS 'datetime2', @thedatetime AS 'datetime';
Hasil:
+-------------------------+-------------------------+ | datetime2 | datetime | |-------------------------+-------------------------| | 2025-05-21 10:15:30.126 | 2025-05-21 10:15:30.127 | +-------------------------+-------------------------+
Dalam hal ini, saya mencoba memberikan nilai dengan bagian pecahan 1256789 . Namun, karena datetime2(3) nilai hanya memiliki skala 3, hanya dapat mendukung 3 tempat desimal, dan dalam hal ini, digit terakhir dibulatkan ke atas (karena digit berikutnya adalah 5 atau lebih tinggi).
Keduanya datetime2(3) dan waktu kencan menggunakan jumlah ruang penyimpanan yang sama (8 byte). datetime2(3) tipe data sebenarnya menggunakan 7 byte untuk menyimpan data, tetapi tambahan 1 byte untuk menyimpan presisi.
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 datetime2 dan waktu kencan .
DECLARE @thedatetime2 datetime2; SET @thedatetime2 = '2025-05-21 10:15:30.1234567'; SELECT @thedatetime2 AS 'datetime2', CAST(@thedatetime2 AS datetime) AS 'datetime';
Hasil:
+-----------------------------+-------------------------+ | datetime2 | datetime | |-----------------------------+-------------------------| | 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.123 | +-----------------------------+-------------------------+
Contoh 4 – Konversi Eksplisit menggunakan CONVERT()
Berikut adalah contoh konversi eksplisit menggunakan CONVERT()
fungsi alih-alih CAST()
.
DECLARE @thedatetime2 datetime2; SET @thedatetime2 = '2025-05-21 10:15:30.1234567'; SELECT @thedatetime2 AS 'datetime2', CONVERT(datetime, @thedatetime2) AS 'datetime';
Hasil:
+-----------------------------+-------------------------+ | datetime2 | datetime | |-----------------------------+-------------------------| | 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.123 | +-----------------------------+-------------------------+