Artikel ini berisi contoh mengonversi waktu kecil nilai untuk waktu nilai di SQL Server.
Saat Anda mengonversi waktu kecil nilai untuk waktu , Anda kehilangan tanggal. Jam, menit, dan detik disalin. Detik pecahan diatur ke 0.
waktu kecil tipe data mencakup tanggal dan waktu. Namun, waktunya tidak memiliki pecahan detik, dan komponen detiknya selalu disetel ke nol (:00). Akurasinya sampai menit terdekat. Ukuran penyimpanannya adalah 4 byte.
Waktu tipe data di sisi lain, hanya mencakup waktu. Namun, ini memungkinkan Anda untuk menentukan presisi pecahan detik dari 0 hingga 7. Hal ini dicapai dengan menggunakan waktu(n ) sintaks, di mana n adalah skala dari 0 hingga 7. Jika Anda tidak menentukan ini, ini akan menggunakan 7 (default), yang memberikan akurasi 100 nanodetik. Jika Anda menentukan nol (0
), akurasinya akan menjadi detik terdekat. Ukuran penyimpanannya akan berupa 3, 4, atau 5 byte (ditambah 1 byte untuk menyimpan presisi), bergantung pada presisi pecahan detik.
Contoh 1 – Konversi Implisit
Berikut adalah contoh konversi implisit antara waktu-tanggal dan waktu .
DECLARE @thesmalldatetime smalldatetime, @thetime time; SET @thesmalldatetime = '2025-05-21 10:15:30'; SET @thetime = @thesmalldatetime; SELECT @thesmalldatetime AS 'smalldatetime', @thetime AS 'time';
Hasil:
+---------------------+----------+ | smalldatetime | time | |---------------------+----------| | 2025-05-21 10:16:00 | 10:16:00 | +---------------------+----------+
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 smalldatetime nilai untuk waktu variabel.
Hal yang paling jelas tentang hasil ini adalah waktu nilai tidak termasuk tanggal. Ini sudah diduga, karena waktu tipe data hanya untuk menyimpan nilai waktu, bukan nilai tanggal.
Apa yang bukan jelas (setidaknya dengan contoh saya) adalah bahwa nilai waktu sebenarnya dapat menangani bagian pecahan detik. Sistem saya tidak menampilkan pecahan detik di sini, tetapi contoh berikutnya akan menunjukkan bahwa ia sebenarnya memiliki presisi pecahan detik 7.
Selain itu, jika Anda perhatikan lebih dekat, Anda akan melihat bahwa waktu kecil nilai dibulatkan menit dari nilai sebenarnya saya mencoba untuk menetapkan untuk itu. Ini mencerminkan presisi yang relatif rendah dari waktu kecil tipe data. Ketepatannya adalah ke menit terdekat. Konsekuensi nyata dari hal ini adalah ketika kita akhirnya menetapkan kembali nilainya ke waktu tipe data, ini adalah nilai yang dibulatkan yang ditetapkan – bukan nilai awal yang saya coba tetapkan. Jika kami telah menetapkan nilai awal langsung ke waktu variabel, kita akan mendapatkan nilai yang lebih tepat (bahkan jika kita menentukan skala 0).
Inilah yang saya maksud:
DECLARE @thesmalldatetime smalldatetime, @thetime time(0); SET @thesmalldatetime = '2025-05-21 10:15:30'; SET @thetime = '2025-05-21 10:15:30'; SELECT @thesmalldatetime AS 'smalldatetime', @thetime AS 'time';
Hasil:
+---------------------+----------+ | smalldatetime | time | |---------------------+----------| | 2025-05-21 10:16:00 | 10:15:30 | +---------------------+----------+
Contoh 2 – Menambahkan Detik Pecahan
waktu kecil tipe data tidak memiliki bagian pecahan detik, tetapi dalam contoh pertama kami, waktu nilai memiliki presisi pecahan detik 7 (meskipun sebenarnya tidak menampilkan tempat desimal apa pun). Saya tahu presisinya karena saya tidak menentukan skala saat mendeklarasikannya, oleh karena itu menggunakan skala default 7.
Berikut ini contoh untuk mengonfirmasi bahwa waktu nilai sebenarnya dapat, mendukung bagian pecahan:
DECLARE @thesmalldatetime smalldatetime, @thetime time; SET @thesmalldatetime = '2025-05-21 10:15:30'; SET @thetime = @thesmalldatetime; SELECT @thesmalldatetime AS 'smalldatetime', @thetime AS 'Original time', DATEADD(nanosecond, 123456700, @thetime) AS 'Modified time';
Hasil:
+---------------------+-----------------+------------------+ | smalldatetime | Original time | Modified time | |---------------------+-----------------+------------------| | 2025-05-21 10:16:00 | 10:16:00 | 10:16:00.1234567 | +---------------------+-----------------+------------------+
Perhatikan bahwa ketika waktu nilai memiliki skala 7, memiliki ukuran penyimpanan 5 byte. Oleh karena itu, ia memiliki persyaratan penyimpanan yang lebih tinggi daripada smalldatetime type (yang hanya menggunakan 4 byte).
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 smalldatetime dan waktu .
DECLARE @thesmalldatetime smalldatetime; SET @thesmalldatetime = '2025-05-21 10:15:30.125'; SELECT @thesmalldatetime AS 'smalldatetime', CAST(@thesmalldatetime AS time(0)) AS 'time(0)';
Hasil:
+---------------------+-----------+ | smalldatetime | time(0) | |---------------------+-----------| | 2025-05-21 10:16:00 | 10:16:00 | +---------------------+-----------+
Dalam contoh ini saya mengatur skala ke 0.
Contoh 4 – Konversi Eksplisit menggunakan CONVERT()
Berikut adalah contoh konversi eksplisit menggunakan CONVERT()
fungsi alih-alih CAST()
.
DECLARE @thesmalldatetime smalldatetime; SET @thesmalldatetime = '2025-05-21 10:15:30.125'; SELECT @thesmalldatetime AS 'smalldatetime', CONVERT(time(0), @thesmalldatetime) AS 'time(0)';
Hasil:
+---------------------+-----------+ | smalldatetime | time(0) | |---------------------+-----------| | 2025-05-21 10:16:00 | 10:16:00 | +---------------------+-----------+