Artikel ini berisi contoh konversi waktu nilai ke waktu kecil nilai di SQL Server.
Saat Anda mengonversi waktu nilai ke smalldatetime , tanggal disetel ke '1900-01-01', dan nilai jam dan menit dibulatkan ke atas. Detik dan detik pecahan diatur ke 0.
Contoh 1 – 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 dari waktu ke waktu kecil .
DECLARE @thetime time; SET @thetime = '23:15:59.1234567'; SELECT @thetime AS 'time', CAST(@thetime AS smalldatetime) AS 'smalldatetime';
Hasil:
+------------------+---------------------+ | time | smalldatetime | |------------------+---------------------| | 23:15:59.1234567 | 1900-01-01 23:16:00 | +------------------+---------------------+
Jadi bagian tanggal ditambahkan dan disetel ke '1900-01-01', dan dalam hal ini nilai menit dibulatkan ke atas dan detik disetel ke 0.
Dokumentasi Microsoft menyatakan bahwa pecahan detik juga disetel ke nol, tetapi waktu kecil tipe data tidak termasuk pecahan detik.
Omong-omong, setiap kali Anda menggunakan smalldatetime tipe data, komponen detik selalu disetel ke 0.
Contoh 2 – Membulatkan Jam
Berikut ini contoh jam yang dibulatkan:
DECLARE @thetime time(0); SET @thetime = '10:59:59'; SELECT @thetime AS 'time', CAST(@thetime AS smalldatetime) AS 'smalldatetime';
Hasil:
+----------+---------------------+ | time | smalldatetime | |----------+---------------------| | 10:59:59 | 1900-01-01 11:00:00 | +----------+---------------------+
Dalam hal ini saya juga menentukan skala 0 untuk nilai waktu, namun, ini tidak mempengaruhi hasilnya.
Untuk memperjelas, skala adalah jumlah digit di sebelah kanan titik desimal dalam suatu bilangan. Presisi adalah jumlah digit dalam bilangan tersebut. Ketika kita menentukan skala 0, itu berarti bagian pecahan tidak disertakan.
Contoh 3 – Konversi Eksplisit menggunakan CONVERT()
Berikut ini contoh menggunakan CONVERT()
fungsi alih-alih CAST()
.
DECLARE @thetime time; SET @thetime = '23:15:59.1234567'; SELECT @thetime AS 'time', CONVERT(smalldatetime, @thetime) AS 'smalldatetime';
Hasil:
+------------------+---------------------+ | time | smalldatetime | |------------------+---------------------| | 23:15:59.1234567 | 1900-01-01 23:16:00 | +------------------+---------------------+
Contoh 4 – Konversi Implisit
Berikut adalah contoh melakukan hal yang sama, tetapi menggunakan konversi tipe implisit.
DECLARE @thetime time, @thesmalldatetime smalldatetime; SET @thetime = '23:15:59.1234567'; SET @thesmalldatetime = @thetime; SELECT @thetime AS 'time', @thesmalldatetime AS 'smalldatetime';
Hasil:
+------------------+---------------------+ | time | smalldatetime | |------------------+---------------------| | 23:15:59.1234567 | 1900-01-01 23:16:00 | +------------------+---------------------+
Jadi kami mendapatkan hasil yang sama, terlepas dari apakah itu konversi eksplisit atau implisit.
Ini adalah konversi implisit karena kami tidak menggunakan fungsi konversi untuk mengonversinya secara eksplisit. Kami hanya menetapkan nilai dari variabel satu tipe data ke variabel tipe data lain. Dalam hal ini, SQL Server melakukan konversi implisit di balik layar saat kami mencoba menetapkan waktu nilai ke waktu kecil variabel.
Contoh 5 – Ubah Tanggal
Jika Anda perlu mengubah tanggal (tetapi tetap pada waktu yang sama), Anda dapat menggunakan DATEADD()
fungsi.
DECLARE @thetime time, @thesmalldatetime smalldatetime; SET @thetime = '23:15:59.1234567'; SET @thesmalldatetime = @thetime; SET @thesmalldatetime = DATEADD(year, 85, @thesmalldatetime); SELECT @thetime AS 'time', @thesmalldatetime AS 'smalldatetime';
Hasil:
+------------------+---------------------+ | time | smalldatetime | |------------------+---------------------| | 23:15:59.1234567 | 1985-01-01 23:16:00 | +------------------+---------------------+
Dalam hal ini saya menambahkan 85 ke nilai tahun, yang membawanya ke 1985.
Namun berhati-hatilah, waktu kecil mendukung rentang tanggal yang sangat sempit (1900-01-01 hingga 2079-06-06), jadi menambahkan terlalu banyak ke tahun dapat mengakibatkan kesalahan luapan seperti di bawah ini:
DECLARE @thetime time, @thesmalldatetime smalldatetime; SET @thetime = '23:15:59.1234567'; SET @thesmalldatetime = @thetime; SET @thesmalldatetime = DATEADD(year, 220, @thesmalldatetime); SELECT @thetime AS 'time', @thesmalldatetime AS 'smalldatetime';
Hasil:
Adding a value to a 'smalldatetime' column caused an overflow.