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

Konversi 'datetimeoffset' menjadi 'waktu' di SQL Server (Contoh T-SQL)

Jika Anda memiliki datetimeoffset nilai, tetapi Anda tidak memerlukan bagian offset zona waktu dan tanggal, mengubahnya menjadi waktu akan menghemat banyak ruang penyimpanan (sambil menghapus detail yang tidak perlu dari nilai). Artikel ini berisi contoh konversi datetimeoffset nilai untuk waktu 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, tergantung pada presisi yang digunakan. Akurasinya adalah 100 nanodetik.

Waktu tipe data di sisi lain, hanya mencakup waktu. Itu tidak termasuk tanggal dan tidak termasuk offset zona waktu. Namun, mirip dengan datetimeoffset itu juga memungkinkan Anda untuk menentukan bagian pecahan detik antara 0 dan 7 (dengan menggunakan time(n) sintaksis). Ini menggunakan 3, 4, atau 5 byte, tergantung pada presisinya.

Saat Anda mengonversi datetimeoffset nilai untuk waktu tipe data, Anda kehilangan bagian tanggal. Anda juga kehilangan offset zona waktu. Namun, Anda juga mengurangi ukuran penyimpanan dari antara 8 dan 10 byte menjadi 3, 4, atau 5 byte. Namun, Anda hanya akan melakukan konversi ini jika Anda tidak memerlukan porsi tanggal atau offset zona waktu.

Perhatikan bahwa jumlah penyimpanan yang tercantum di sini adalah jumlah yang tercantum dalam dokumentasi Microsoft. Namun, tipe data ini juga menggunakan 1 byte untuk menyimpan presisi. Oleh karena itu, Anda harus menambahkan 1 byte ke jumlah yang tercantum di sini.

Contoh 1 – Konversi Implisit

Berikut adalah contoh konversi implisit antara datetimeoffset dan waktu .

DECLARE 
  @thedatetimeoffset datetimeoffset, 
  @thetime time;
SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +10:30';
SET @thetime = @thedatetimeoffset;
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  @thetime AS 'time';

Hasil:

+------------------------------------+------------------+
| datetimeoffset                     | time             |
|------------------------------------+------------------|
| 2025-05-21 10:15:30.1234567 +10:30 | 10:15:30.1234567 |
+------------------------------------+------------------+

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

Di sini kita dapat melihat bahwa waktu nilai hanya mencakup waktu (tanpa komponen tanggal). Komponen offset zona waktu dan tanggal telah dihapus dari nilainya.

Dalam contoh ini, kedua tipe data menggunakan presisi default (yang menghasilkan 7 tempat desimal). Ini menghasilkan datetimeoffset nilai menggunakan 10 byte dan waktu nilai menggunakan 5 byte.

Contoh 2 – Presisi

Hasil yang tepat akan tergantung pada pengaturan presisi untuk setiap tipe data. Pada contoh berikutnya waktu value menggunakan presisi yang lebih rendah dari datetimeoffset original asli nilai:

DECLARE 
  @thedatetimeoffset datetimeoffset(7), 
  @thetime time(3);
SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +10:30';
SET @thetime = @thedatetimeoffset;
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  @thetime AS 'time';

Hasil:

+------------------------------------+------------------+
| datetimeoffset                     | time             |
|------------------------------------+------------------|
| 2025-05-21 10:15:30.1234567 +10:30 | 10:15:30.1230000 |
+------------------------------------+------------------+

Sistem saya menampilkan angka nol, tetapi intinya adalah waktu nilai sekarang memiliki presisi hingga hanya 3 tempat desimal dibandingkan dengan 7 tempat desimal yang digunakan nilai aslinya.

Mengurangi presisi juga dapat mengakibatkan waktu nilai yang dibulatkan. Ini contohnya:

DECLARE 
  @thedatetimeoffset datetimeoffset(7), 
  @thetime time(3);
SET @thedatetimeoffset = '2025-05-21 10:15:30.1235555 +10:30';
SET @thetime = @thedatetimeoffset;
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  @thetime AS 'time';

Hasil:

+------------------------------------+------------------+
| datetimeoffset                     | time             |
|------------------------------------+------------------|
| 2025-05-21 10:15:30.1234567 +10:30 | 10:15:30.1240000 |
+------------------------------------+------------------+

Dalam hal ini kita mendapatkan bagian pecahan dari 124 bukannya 123 , karena angka berikut adalah 5 atau lebih besar.

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 datetimeoffset dan waktu .

DECLARE @thedatetimeoffset datetimeoffset;
SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +10:30';
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  CAST(@thedatetimeoffset AS time) AS 'time'; 

Hasil:

+------------------------------------+------------------+
| datetimeoffset                     | date             |
|------------------------------------+------------------|
| 2025-05-21 10:15:30.1234567 +10:30 | 10:15:30.1234567 |
+------------------------------------+------------------+

Contoh 4 – 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';
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  CONVERT(time, @thedatetimeoffset) AS 'time'; 

Hasil:

+------------------------------------+------------------+
| datetimeoffset                     | date             |
|------------------------------------+------------------|
| 2025-05-21 10:15:30.1234567 +10:30 | 10:15:30.1234567 |
+------------------------------------+------------------+

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ekspor hasil prosedur tersimpan yang disetel ke Excel di SSMS

  2. Kolom Jarang di SQL Server:Dampak pada Waktu &Ruang

  3. Dalam SQL, bagaimana Anda bisa mengelompokkan dalam rentang?

  4. cara terbaik untuk mengonversi dan memvalidasi string tanggal

  5. DEGREES() Contoh di SQL Server