Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Ubah 'waktu' menjadi 'datetime2' di SQL Server (Contoh T-SQL)

Artikel ini berisi contoh konversi waktu nilai ke datetime2 nilai di SQL Server.

Saat Anda mengonversi waktu nilai ke datetime2 , informasi tambahan ditambahkan ke nilai. Ini karena datetime2 tipe data berisi informasi tanggal dan waktu. Waktu tipe data, di sisi lain, hanya berisi informasi waktu.

Lebih khusus lagi, tanggal diatur ke '1900-01-01' (kecuali jika kebetulan dibulatkan menjadi '1900-01-02'), komponen waktu disalin, dan menurut dokumentasi Microsoft, zona waktu offset diatur ke 00:00 (meskipun datetime2 tipe data tidak menyadari zona waktu dan tidak mempertahankan offset zona waktu apa pun).

Ketika presisi pecahan detik dari datetime2(n) nilainya lebih besar dari waktu(n) nilai, nilainya dibulatkan ke atas.

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 datetime2 .

DECLARE @thetime time;SET @thetime ='23:15:59.004007';SELECT @thetime AS 'time', CAST(@thetime AS datetime2) AS 'datetime2';

Hasil:

+------------------+--------------------------- --+| waktu | datetime2 ||------------------+---------------------------- -|| 23:15:59.0040070 | 1900-01-01 23:15:59.0040070 |+------------------+------------------- ----------+

Saat Anda mengonversi dari waktu ke datetime2 , komponen tanggal ditambahkan dan disetel ke 1900-01-01 .

Namun, ada skenario di mana tanggal dapat dibulatkan menjadi 1900-01-02 . Ini akan tergantung pada pecahan detik dan presisi apa yang Anda gunakan. Lihat di bawah untuk contohnya.

Contoh 2 – Ketepatan Detik Pecahan

Anda bisa mendapatkan hasil yang berbeda bergantung pada presisi pecahan detik yang ditetapkan untuk setiap tipe data. Ini akan tergantung pada nilai sebenarnya dari bagian pecahan.

Pada contoh sebelumnya, kedua tipe data menggunakan presisi pecahan detik yang sama. Ini karena saya tidak menentukan skala (untuk menentukan presisinya) dan oleh karena itu keduanya menggunakan nilai skala default (keduanya adalah 7).

Untuk memperjelas, skala adalah jumlah digit di sebelah kanan titik desimal dalam suatu bilangan. Presisi adalah jumlah total digit dalam nomor tersebut.

Bagaimanapun, dalam contoh itu saya hanya menetapkan 6 tempat desimal ke nilai awal, oleh karena itu, nol ditambahkan ke akhir.

Inilah yang terjadi jika saya menetapkan presisi yang lebih tinggi untuk waktu nilai dibandingkan dengan datetime2 nilai:

DECLARE @thetime time(7);SET @thetime ='23:15:59.1234567';SELECT @thetime AS 'time', CAST(@thetime AS datetime2(4)) AS 'datetime2(4)'; 

Hasil:

+------------------+--------------------------+ | waktu | datetime2(4) ||------------------+------------------------- -|| 23:15:59.1234567 | 1900-01-01 23:15:59.1235 |+------------------+------------------- -------+

Dengan menentukan skala 4 ke datetime2 nilai, hasilnya dikurangi menjadi 4 tempat desimal, dan dalam hal ini dibulatkan.

Seperti yang Anda duga, bukan hanya bagian pecahan yang bisa dibulatkan. Berikut adalah contoh di mana bagian pecahan menyebabkan menit dan detik dibulatkan ke atas:

DECLARE @thetime time(7);SET @thetime ='23:15:59.7654321';SELECT @thetime AS 'time', CAST(@thetime AS datetime2(0)) AS 'datetime2(0)'; 

Hasil:

+------------------+---------------------+| waktu | datetime2(0) ||------------------+---------------------|| 23:15:59.7654321 | 1900-01-01 23:16:00 |+------------------+------------------- --+

Namun, Anda bisa mendapatkan hasil yang berbeda untuk data yang sama dengan mengubah presisi. Jika kita meningkatkan presisi, bahkan hanya dengan satu tempat desimal, kita mendapatkan ini:

DECLARE @thetime time(7);SET @thetime ='23:15:59.7654321';SELECT @thetime AS 'time', CAST(@thetime AS datetime2(1)) AS 'datetime2(1)'; 

Hasil:

+------------------+-----------------------+| waktu | datetime2(1) ||------------------+-----------------------|| 23:15:59.7654321 | 1900-01-01 23:15:59.8 |+------------------+------------------- ----+

Jadi dalam hal ini menit dan detik bukan dibulatkan (tetapi milidetik adalah ).

Inilah yang terjadi jika saya menyetel waktu nilai untuk menggunakan skala presisi yang lebih rendah daripada datetime2 nilai.

DECLARE @thetime time(0);SET @thetime ='23:15:59.004007';SELECT @thetime AS 'time', CAST(@thetime AS datetime2) AS 'datetime2';

Hasil:

+----------+-----------------------------+| waktu | datetime2 ||----------+-----------------------------|| 23:15:59 | 1900-01-01 23:15:59,0000000 |+----------+--------------------------- --+

Dan sementara kami melakukannya, berikut adalah contoh di mana skala presisi kami dapat menghasilkan pecahan detik yang menyebabkan tanggal dibulatkan ke hari berikutnya:

DECLARE @thetime time(7);SET @thetime ='23:59:59.9999999';SELECT @thetime AS 'time', CAST(@thetime AS datetime2(0)) AS 'datetime2(0)'; 

Hasil:

+------------------+---------------------+| waktu | datetime2(0) ||------------------+---------------------|| 23:59:59.9999999 | 1900-01-02 00:00:00 |+------------------+------------------- --+

Contoh 3 – Konversi Eksplisit menggunakan CONVERT()

Ini sama dengan contoh pertama, kecuali kali ini saya menggunakan CONVERT() fungsi alih-alih CAST() .

DECLARE @thetime time;SET @thetime ='23:15:59.004007';SELECT @thetime SEBAGAI 'waktu', CONVERT(datetime2, @thetime) SEBAGAI 'datetime2';

Hasil:

+------------------+--------------------------- --+| waktu | datetime2 ||------------------+---------------------------- -|| 23:15:59.0040070 | 1900-01-01 23:15:59.0040070 |+------------------+------------------- ----------+

Contoh 4 – Konversi Implisit

Berikut adalah contoh melakukan hal yang sama, tetapi menggunakan konversi tipe implisit.

DECLARE @thetime time, @thedatetime2 datetime2;SET @thetime ='23:15:59.004007';SET @thedatetime2 =@thetime;PILIH @thetime SEBAGAI 'waktu', @thedatetime2 SEBAGAI 'datetime2';

Hasil:

+------------------+--------------------------- --+| waktu | datetime2 ||------------------+---------------------------- -|| 23:15:59.0040070 | 1900-01-01 23:15:59.0040070 |+------------------+------------------- ----------+

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 datetime2 variabel.

Contoh 5 – Ubah Tanggal

Jika Anda perlu mengubah tanggal (tetapi tetap pada waktu yang sama), Anda dapat menggunakan DATEADD() fungsi.

DECLARE @thetime time, @thedatetime2 datetime2;SET @thetime ='23:15:59.004007';SET @thedatetime2 =@thetime;SET @thedatetime2 =DATEADD(tahun, 120, @thedatetime2);PILIH @waktu AS ' time', @thedatetime2 SEBAGAI 'datetime2';

Hasil:

+------------------+--------------------------- --+| waktu | datetime2 ||------------------+---------------------------- -|| 23:15:59.0040070 | 01-01-2020 23:15:59.0040070 |+------------------+------------------- ----------+

Dalam hal ini saya menambahkan 120 ke nilai tahun, yang membawanya ke 2020.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Apa itu Kolom Terhitung di SQL Server?

  2. Mendapatkan Hibernate dan SQL Server untuk bermain bagus dengan VARCHAR dan NVARCHAR

  3. Periksa apakah Tabel Direferensikan oleh Kunci Asing di SQL Server dengan OBJECTPROPERTY()

  4. SQL Server Ketersediaan tinggi:Tambahkan disk baru ke instance kluster failover yang ada

  5. Cara Memeriksa apakah Kolom yang Dihitung "Bertahan" di SQL Server