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

Ubah 'smalldatetime' menjadi 'datetimeoffset' di SQL Server (Contoh T-SQL)

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

Saat Anda mengonversi waktu kecil nilai ke datetimeoffset , waktu kecil nilai disalin ke datetimeoffset nilai. Detik pecahan diatur ke 0, dan offset zona waktu diatur ke +00:0.

waktu kecil tipe data tidak memiliki pecahan detik, dan komponen detiknya selalu disetel ke nol (:00). Akurasinya sampai menit terdekat.

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 kecil tidak memiliki kesadaran zona waktu, jadi tidak ada nilai yang ada untuk dipertahankan. Dalam hal ini, offset zona waktu diatur 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, lihat komentar saya di bawah dan beberapa contoh mengenai opsi ini.

Contoh 1 – Konversi Implisit

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

DECLARE 
  @thesmalldatetime smalldatetime, 
  @thedatetimeoffset datetimeoffset(7);
SET @thesmalldatetime = '2025-05-21 10:15:30';
SET @thedatetimeoffset = @thesmalldatetime;
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  @thedatetimeoffset AS 'datetimeoffset(7)';

Hasil:

+---------------------+------------------------------------+
| smalldatetime       | datetimeoffset(7)                  |
|---------------------+------------------------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00.0000000 +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 smalldatetime nilai ke datetimeoffset variabel.

Kita dapat melihat bahwa datetimeoffset variabel memiliki bagian pecahan ( 0000000 ), sedangkan smalldatetime nilai tidak memiliki bagian pecahan, dan menitnya dibulatkan ketika menetapkan nilai awal untuk itu. offset datetime nilai juga mencakup offset zona waktu +00:00 .

Menggunakan presisi 7 detik pecahan menyebabkan datetimeoffset menggunakan 11 byte untuk penyimpanan (10 byte untuk menyimpan data, 1 byte untuk presisi). Sebagai perbandingan, smalldatetime hanya menggunakan 4 byte. Namun, Anda dapat mengurangi ketepatan datetimeoffset nilai dengan mengganti 7 dengan angka yang lebih rendah. Jika Anda ingin menghapus bagian pecahan detik sekaligus, cukup gunakan datetimeoffset(0) . Melakukan hal ini akan mengurangi ukuran penyimpanan menjadi 9 byte (termasuk 1 untuk presisi).

Contoh 2 – 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 smalldatetime dan datetimeoffset .

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

Hasil:

+---------------------+------------------------------------+
| smalldatetime       | datetimeoffset(7)                  |
|---------------------+------------------------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00.0000000 +00:00 |
+---------------------+------------------------------------+

Contoh 3 – Konversi Eksplisit menggunakan CONVERT()

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

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

Hasil:

+---------------------+------------------------------------+
| smalldatetime       | datetimeoffset(7)                  |
|---------------------+------------------------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00.0000000 +00:00 |
+---------------------+------------------------------------+

Contoh 4 – Mengubah Offset Zona Waktu

Fakta bahwa Anda mengonversi waktu kecil nilai ke datetimeoffset berarti Anda mungkin melakukannya untuk offset zona waktu. Dan kemungkinan Anda ingin mengaturnya ke offset yang berbeda dari +00:00 (offset default).

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

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

Ini contohnya:

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

Hasil:

+---------------------+------------------------------------+
| smalldatetime       | datetimeoffset                     |
|---------------------+------------------------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00.0000000 +07:00 |
+---------------------+------------------------------------+

Dan inilah contoh penggunaan fungsi di dalam SELECT pernyataan:

DECLARE @thesmalldatetime smalldatetime = '2025-05-21 10:15:30';
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  TODATETIMEOFFSET(@thesmalldatetime, '+07:00') AS 'datetimeoffset';

Hasil:

+---------------------+------------------------------------+
| smalldatetime       | datetimeoffset                     |
|---------------------+------------------------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00.0000000 +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 kecil argumen, yang tidak memiliki detik pecahan.

Sistem saya mengembalikan angka nol dengan datetimeoffset bagian pecahan, namun, Anda mungkin melihat sesuatu seperti ini:

+---------------------+----------------------------+
| smalldatetime       | datetimeoffset             |
|---------------------+----------------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00 +07:00 |
+---------------------+----------------------------+

Apa pun itu, Anda tetap dapat memanfaatkan datetimeoffset . sepenuhnya presisi tipe data jika Anda perlu mengubah nilainya nanti.

Berikut adalah contoh yang menggunakan DATEADD() berfungsi untuk mengubah pecahan detik setelah konversi selesai.

DECLARE @thesmalldatetime smalldatetime, @thedatetimeoffset datetimeoffset(7);
SET @thesmalldatetime = '2025-05-21 10:15:30';
SET @thedatetimeoffset = TODATETIMEOFFSET(@thesmalldatetime, '+07:00');
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  @thedatetimeoffset AS 'datetimeoffset',
  DATEADD(nanosecond, 123456700, @thedatetimeoffset) AS 'Modified';

Hasil (menggunakan keluaran vertikal):

smalldatetime  | 2025-05-21 10:16:00
datetimeoffset | 2025-05-21 10:16:00.0000000 +07:00
Modified       | 2025-05-21 10:16:00.1234567 +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. Menemukan acara simultan dalam database antara waktu

  2. Menggunakan prosedur tersimpan SQL Server dari Python (pyodbc)

  3. Membandingkan Cloud Virtual Machines dengan Managed Cloud Database

  4. menampilkan beberapa catatan dengan menggunakan resultset

  5. Algoritma pengurutan SQL Server GUID. Mengapa?