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

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

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

Saat Anda mengonversi waktu tanggal nilai ke datetimeoffset , nilai yang dihasilkan akan bergantung pada presisi pecahan detik yang Anda tetapkan ke datetimeoffset , serta offset zona waktu yang Anda tentukan.

waktu kencan tipe data memiliki maksimal 3 digit untuk bagian pecahan detik. Akurasinya dibulatkan menjadi .000, .003, atau .007 detik.

offset datetime tipe data, di sisi lain, memungkinkan Anda untuk menentukan presisi pecahan detik dari 0 hingga 7. Jika Anda tidak menentukan ini, itu akan menggunakan 7 (default). Ini juga memiliki offset zona waktu dan dapat mempertahankan offset apa pun dalam nilai aslinya. Namun, waktu tanggal tidak memiliki kesadaran zona waktu, jadi tidak ada nilai yang ada untuk dipertahankan. Dalam hal ini, offset zona waktu default ke +00:00.

SQL Server sebenarnya memiliki TODATETIMEOFFSET() fungsi, yang dirancang khusus untuk mengonversi nilai tanggal/waktu ke datetimeoffset dan tambahkan offset zona waktu. Namun, ada detail halus yang harus diperhatikan saat menggunakan fungsi ini, dan saya menjelaskannya di bawah (dengan contoh).

Contoh 1 – Konversi Implisit

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

DECLARE 
  @thedatetime datetime, 
  @thedatetimeoffset datetimeoffset(7);
SET @thedatetime = '2025-05-21 10:15:30.123';
SET @thedatetimeoffset = @thedatetime;
SELECT 
  @thedatetime AS 'datetime',
  @thedatetimeoffset AS 'datetimeoffset(7)';

Hasil:

+-------------------------+------------------------------------+
| datetime                | datetimeoffset(7)                  |
|-------------------------+------------------------------------|
| 2025-05-21 10:15:30.123 | 2025-05-21 10:15:30.1233333 +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 waktu tanggal nilai ke datetimeoffset variabel.

Kita dapat melihat bahwa datetimeoffset variabel memiliki presisi pecahan detik yang lebih banyak, dan kami berakhir dengan bagian pecahan 1233333 (vs 123 untuk waktu kencan nilai). Kami juga berakhir dengan offset zona waktu +00:00 .

Menggunakan presisi 7 detik pecahan menyebabkan datetimeoffset untuk menggunakan 10 byte untuk penyimpanan (11 byte jika Anda menyertakan byte yang menyimpan presisinya). Sebagai perbandingan, datetime hanya menggunakan 8 byte. Namun, Anda dapat mengurangi ketepatan datetimeoffset nilai dengan mengganti 7 dengan angka yang lebih rendah. Ini adalah konsep yang sama seperti saat menggunakan datetime2 tipe data. Lihat Mengonversi 'datetime' menjadi 'datetime2' di SQL Server untuk contoh bagaimana hal ini dapat memengaruhi hasil akhir.

Contoh 2 – Pembulatan

waktu kencan tipe data dibulatkan menjadi kelipatan .000, .003, atau .007 detik. Bahkan jika Anda secara eksplisit mengaturnya ke nilai lain, itu akan dibulatkan. Ini dapat menyebabkan Anda banyak kebingungan jika Anda tidak mengetahui cara kerjanya. Tidak hanya dapat menyebabkan kebingungan saat menggunakan datetime dengan sendirinya, ini dapat menyebabkan kebingungan ekstra saat mengonversi nilai tersebut ke tipe data lain.

Berikut adalah contoh yang menunjukkan apa yang saya maksud.

DECLARE 
  @thedatetime datetime, 
  @thedatetimeoffset datetimeoffset;
SET @thedatetime = '2025-05-21 10:15:30.125';
SET @thedatetimeoffset = @thedatetime;
SELECT 
  @thedatetime AS 'datetime',
  @thedatetimeoffset AS 'datetimeoffset(7)';

Hasil:

+-------------------------+------------------------------------+
| datetime                | datetimeoffset(7)                  |
|-------------------------+------------------------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.1266667 +00:00 |
+-------------------------+------------------------------------+

Dalam contoh ini, saya mengatur pecahan detik ke 125 tapi waktu kencan dibulatkan menjadi 127 (karena tipe data ini hanya dapat dibulatkan ke kelipatan .000, .003, atau .007 detik).

offset datetime sebaliknya, atur pecahan detik ke 1266667 .

Namun, jika kita cukup menyetel nilai awal ke datetimeoffset pertama-tama, bagian pecahannya akan mengembalikan 1250000 .

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 mengkonversi antara datetime dan datetimeoffset .

DECLARE @thedatetime datetime;
SET @thedatetime = '2025-05-21 10:15:30.125';
SELECT 
  @thedatetime AS 'datetime',
  CAST(@thedatetime AS datetimeoffset(7)) AS 'datetimeoffset(7)';

Hasil:

+-------------------------+------------------------------------+
| datetime                | datetimeoffset(7)                  |
|-------------------------+------------------------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.1266667 +00:00 |
+-------------------------+------------------------------------+

Contoh 4 – Konversi Eksplisit menggunakan CONVERT()

Berikut adalah contoh konversi eksplisit menggunakan CONVERT() fungsi alih-alih CAST() .

DECLARE @thedatetime datetime;
SET @thedatetime = '2025-05-21 10:15:30.125';
SELECT 
  @thedatetime AS 'datetime',
  CONVERT(datetimeoffset(7), @thedatetime) AS 'datetimeoffset(7)';

Hasil:

+-------------------------+------------------------------------+
| datetime                | datetimeoffset(7)                  |
|-------------------------+------------------------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.1266667 +00:00 |
+-------------------------+------------------------------------+

Contoh 5 – Mengubah Offset Zona Waktu

Jika Anda kesulitan mengonversi waktu tanggal nilai ke datetimeoffset , Anda mungkin memerlukan offset zona waktu. Dan ada kemungkinan kuat bahwa Anda ingin mengaturnya ke sesuatu selain +00:00.

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

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

Ini contohnya:

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

Hasil:

+-------------------------+------------------------------------+
| datetime                | datetimeoffset(7)                  |
|-------------------------+------------------------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.1270000 +07:00 |
+-------------------------+------------------------------------+

Dan inilah contoh penggunaan fungsi di dalam SELECT pernyataan:

DECLARE @thedatetime datetime = '2025-05-21 10:15:30.125';
SELECT 
  @thedatetime AS 'datetime',
  TODATETIMEOFFSET(@thedatetime, '+07:00') AS 'datetimeoffset';

Hasil:

+-------------------------+------------------------------------+
| datetime                | datetimeoffset(7)                  |
|-------------------------+------------------------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.1270000 +07:00 |
+-------------------------+------------------------------------+

Satu poin penting tentang TODATETIMEOFFSET() fungsinya adalah ia menggunakan presisi fraksional yang sama dengan argumen tanggal/waktu yang diteruskan ke sana. Dalam hal ini adalah waktu kencan argumen, sehingga memiliki skala 3 (yaitu 3 detik pecahan). Ini mungkin atau mungkin tidak menjadi masalah bagi Anda. Jika ya, Anda selalu dapat mengonversinya menjadi datetimeoffset pertama, lalu berikan nilai yang dikonversi itu ke TODATETIMEOFFSET() .

Contoh:

DECLARE @thedatetime datetime, @thedatetimeoffset datetimeoffset(7);
SET @thedatetime = '2025-05-21 10:15:30.125';
SET @thedatetimeoffset = @thedatetime;
SELECT 
  @thedatetime AS 'datetime',
  @thedatetimeoffset AS 'datetimeoffset',
  TODATETIMEOFFSET(@thedatetimeoffset, '+07:00') AS 'Modified';

Hasil (menggunakan keluaran vertikal):

datetime       | 2025-05-21 10:15:30.127
datetimeoffset | 2025-05-21 10:15:30.1266667 +00:00
Modified       | 2025-05-21 10:15:30.1266667 +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. Menggunakan Indeks di Tabel yang Dioptimalkan Memori SQL Server

  2. Objek 'DF__*' bergantung pada kolom '*' - Mengubah int menjadi double

  3. Perbaiki "tanggal tidak kompatibel dengan int" di SQL Server saat Menambah atau Mengurangi dari Tanggal

  4. Cara Menginstal SQL Server di SUSE 12

  5. Bagaimana cara mengekspor semua data dari tabel ke format sql yang dapat disisipkan?