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

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

Artikel ini berisi contoh mengonversi datetime2 nilai ke datetimeoffset nilai di SQL Server.

Saat Anda mengonversi datetime2 nilai ke datetimeoffset , nilai yang dihasilkan akan bergantung pada presisi pecahan detik yang ditetapkan untuk setiap tipe data, serta offset zona waktu yang Anda tentukan.

Kedua tipe data memungkinkan Anda untuk menentukan presisi pecahan detik dari 0 hingga 7. Jika Anda tidak menentukan ini, skala default 7 akan digunakan.

offset datetime tipe data menyertakan offset zona waktu dan dapat mempertahankan offset apa pun dalam nilai aslinya. Namun, datetime2 tidak memiliki kesadaran zona waktu, jadi tidak ada nilai yang ada untuk dipertahankan. Dalam hal ini, offset zona waktu default ke +00:00.

TODATETIMEOFFSET() fungsi secara khusus dirancang untuk mengonversi nilai tanggal/waktu menjadi datetimeoffset dan tambahkan offset zona waktu. Namun, lihat komentar saya (dan contoh) di bawah mengenai opsi ini.

Contoh 1 – Konversi Implisit

Pertama, berikut adalah contoh konversi implisit antara datetime2 dan datetimeoffset .

DECLARE 
  @thedatetime2 datetime2(7), 
  @thedatetimeoffset datetimeoffset(7);
SET @thedatetime2 = '2025-05-21 10:15:30.1234567';
SET @thedatetimeoffset = @thedatetime2;
SELECT 
  @thedatetime2 AS 'datetime2',
  @thedatetimeoffset AS 'datetimeoffset(7)';

Hasil:

+-----------------------------+------------------------------------+
| datetime2                   | datetimeoffset(7)                  |
|-----------------------------+------------------------------------|
| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.1234567 +00: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 datetime2 nilai ke datetimeoffset variabel.

Kita dapat melihat bahwa datetimeoffset variabel dapat menggunakan presisi yang sama dengan datetime2 nilai (7 tempat desimal). Kami juga berakhir dengan offset zona waktu +00:00 .

Menggunakan presisi 7 detik pecahan menyebabkan datetimeoffset menggunakan 11 byte untuk penyimpanan (10 untuk data dan 1 byte untuk presisi). datetime2 type menggunakan 9 byte (8 untuk data dan 1 byte untuk presisi) saat menggunakan skala 7.

Namun, Anda dapat mengurangi presisi dengan mengganti angka 7 dengan angka yang lebih rendah.

Contoh 2 – Pembulatan

Jika datetimeoffset memiliki presisi yang lebih rendah daripada datetime2 nilai, itu akan dibulatkan.

Ini contohnya:

DECLARE 
  @thedatetime2 datetime2(7), 
  @thedatetimeoffset datetimeoffset(6);
SET @thedatetime2 = '2025-05-21 10:15:30.1234567';
SET @thedatetimeoffset = @thedatetime2;
SELECT 
  @thedatetime2 AS 'datetime2(7)',
  @thedatetimeoffset AS 'datetimeoffset(6)';

Hasil:

+-----------------------------+------------------------------------+
| datetime2(7)                | datetimeoffset(6)                  |
|-----------------------------+------------------------------------|
| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.1234570 +00:00 |
+-----------------------------+------------------------------------+

Dalam contoh ini, datetime2 nilai memiliki skala 7 tetapi datetimeoffset skala nilainya hanya 6. Oleh karena itu, presisinya hanya sampai 6 tempat desimal, dan digit keenamnya dibulatkan menjadi 7 (bukan 6).

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

DECLARE @thedatetime2 datetime2;
SET @thedatetime2 = '2025-05-21 10:15:30.1234567';
SELECT 
  @thedatetime2 AS 'datetime2',
  CAST(@thedatetime2 AS datetimeoffset) AS 'datetimeoffset';

Hasil:

+-----------------------------+------------------------------------+
| datetime2                   | datetimeoffset                     |
|-----------------------------+------------------------------------|
| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.1234567 +00:00 |
+-----------------------------+------------------------------------+

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(datetimeoffset, @thedatetime2) AS 'datetimeoffset';

Hasil:

+-----------------------------+------------------------------------+
| datetime2                   | datetimeoffset                     |
|-----------------------------+------------------------------------|
| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.1234567 +00:00 |
+-----------------------------+------------------------------------+

Contoh 5 – Mengubah Offset Zona Waktu

Jika Anda mengonversi dari datetime2 ke datetimeoffset , Anda mungkin melakukannya untuk offset zona waktu. Kemungkinan besar Anda juga akan membutuhkan nilai selain dari +00:00 default.

Untungnya, Anda dapat menggunakan TODATETIMEOFFSET() berfungsi untuk mengubah offset.

Anda juga dapat menggunakan fungsi ini untuk mengonversi datetime2 yang asli nilai ke datetimeoffset nilai. Fungsi ini menerima nilai tanggal/waktu apa pun yang dapat diselesaikan menjadi datetime2 nilai, dan nilai offset.

Ini contohnya:

DECLARE @thedatetime2 datetime2, @thedatetimeoffset datetimeoffset;
SET @thedatetime2 = '2025-05-21 10:15:30.1234567';
SET @thedatetimeoffset = TODATETIMEOFFSET(@thedatetime2, '+07:00');
SELECT 
  @thedatetime2 AS 'datetime2',
  @thedatetimeoffset AS 'datetimeoffset';

Hasil:

+-----------------------------+------------------------------------+
| datetime2                   | datetimeoffset                     |
|-----------------------------+------------------------------------|
| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.1234567 +07:00 |
+-----------------------------+------------------------------------+

Dan inilah contoh penggunaan fungsi di dalam SELECT pernyataan:

DECLARE @thedatetime2 datetime2 = '2025-05-21 10:15:30.1234567';
SELECT 
  @thedatetime2 AS 'datetime2',
  TODATETIMEOFFSET(@thedatetime2, '+07:00') AS 'datetimeoffset';

Hasil:

+-----------------------------+------------------------------------+
| datetime2                   | datetimeoffset                     |
|-----------------------------+------------------------------------|
| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.1234567 +07:00 |
+-----------------------------+------------------------------------+

Satu poin penting tentang TODATETIMEOFFSET() fungsinya adalah ia menggunakan presisi fraksional yang sama dengan argumen tanggal/waktu yang diteruskan ke sana.

Oleh karena itu, jika datetime2 . Anda menggunakan presisi yang lebih rendah daripada datetimeoffset , Anda selalu dapat menetapkannya kembali ke variabel dengan presisi yang lebih tinggi, lalu meneruskan nilai yang dikonversi itu ke TODATETIMEOFFSET() .

Contoh:

DECLARE @lowprecision datetime2(3), @highprecision datetime2(7);
SET @lowprecision = '2025-05-21 10:15:30.123';
SET @highprecision = @lowprecision;
SELECT 
  @lowprecision AS 'lowprecision',
  @highprecision AS 'highprecision',
  TODATETIMEOFFSET(@highprecision, '+07:00') AS 'Modified';

Hasil (menggunakan keluaran vertikal):

lowprecision  | 2025-05-21 10:15:30.123
highprecision | 2025-05-21 10:15:30.1230000
Modified      | 2025-05-21 10:15:30.1230000 +07:00

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Perbaiki Msg 8117 "Operand tipe data varchar tidak valid untuk operator penjumlahan" di SQL Server

  2. Bagaimana Anda melihat SEMUA teks dari ntext atau nvarchar(max) di SSMS?

  3. Urutan Eksekusi kueri SQL

  4. Menghapus Profil Email Database (SSMS)

  5. Kolom tanggal di SQL-Server (MSSQL-JDBC 3.0) berjalan di bawah Java 1.7.0 diambil sebagai 2 hari di masa lalu