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

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

Artikel ini berisi contoh konversi waktu nilai ke datetimeoffset nilai di SQL Server menggunakan Transact-SQL.

Saat Anda mengonversi waktu nilai ke datetimeoffset , tanggal diatur ke '1900-01-01' dan waktu disalin. Offset zona waktu ditambahkan dan disetel ke +00:00.

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

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

Hasil:

+------------------+------------------------------------+
| time             | datetimeoffset                     |
|------------------+------------------------------------|
| 23:15:59.1234567 | 1900-01-01 23:15:59.1234567 +00:00 |
+------------------+------------------------------------+

Jadi bagian tanggal ditambahkan dan disetel ke '1900-01-01', waktu disalin, dan offset zona waktu ditambahkan dan disetel ke +00:00.

Contoh 2 – Presisi

Pada contoh sebelumnya, kedua tipe data menggunakan presisi/skala default (7). Ini karena saya tidak menambahkan skala dalam tanda kurung (skala menentukan presisi pecahan detik). Dengan menggunakan skala 7, kita dapat melihat bahwa kedua tipe data tersebut mampu mewakili nilai waktu yang tepat hingga 7 tempat desimal.

Dengan kata lain, ketika saya awalnya mengatur @thetime variabel, saya menyertakan 7 tempat desimal dalam nilai (khususnya, 1234567 ). Baik tipe data 'waktu' dan 'datetimeoffset' berhasil mewakili ini karena keduanya menggunakan skala 7. Sekali lagi, kita tahu bahwa mereka menggunakan 7 karena itulah nilai defaultnya.

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

Kami dapat mengurangi presisi pecahan detik jika diperlukan.

Berikut adalah beberapa contoh yang menunjukkan apa yang terjadi ketika tipe data disetel untuk menggunakan presisi pecahan detik yang berbeda:

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

Hasil:

+------------------+------------------------------------+
| time             | datetimeoffset                     |
|------------------+------------------------------------|
| 23:15:59.1234567 | 1900-01-01 23:15:59.0000000 +00:00 |
+------------------+------------------------------------+

Dalam hal ini saya secara eksplisit mengatur @thetime variabel untuk menggunakan skala 7. Tetapi ketika saya melemparkan ini ke datetimeoffset , saya menyetel skala ke 0. Oleh karena itu, hasil untuk datetimeoffset nilai kurang presisi pecahan detik. Di sistem saya, 7 tempat desimal masih ditampilkan, tetapi semuanya 0.

Ini dia lagi, tapi kali ini saya meningkatkan presisi pecahan detik menjadi 3 untuk datetimeoffset nilai:

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

Hasil:

+------------------+------------------------------------+
| time             | datetimeoffset                     |
|------------------+------------------------------------|
| 23:15:59.1234567 | 1900-01-01 23:15:59.1230000 +00:00 |
+------------------+------------------------------------+

Jadi ia menggunakan 3 detik pecahan pertama (milidetik).

Namun, jika kita meningkatkan presisi pecahan detik menjadi 4, lihat apa yang terjadi:

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

Hasil:

+------------------+------------------------------------+
| time             | datetimeoffset                     |
|------------------+------------------------------------|
| 23:15:59.1234567 | 1900-01-01 23:15:59.1235000 +00:00 |
+------------------+------------------------------------+

Pada contoh berikut saya menaikkan nilai bagian pecahan sehingga menyebabkan bagian non-fraksi dari datetimeoffset nilai yang akan dibulatkan ke atas:

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

Hasil:

+------------------+------------------------------------+
| time             | datetimeoffset                     |
|------------------+------------------------------------|
| 23:15:59.7654321 | 1900-01-01 23:16:00.0000000 +00:00 |
+------------------+------------------------------------+

Dalam hal ini, menit dibulatkan ke atas dan detik disetel ke nol.

Mari kita tukar sehingga datetimeoffset memiliki presisi yang lebih tinggi daripada waktu nilai:

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

Hasil:

+------------------+------------------------------------+
| time             | datetimeoffset                     |
|------------------+------------------------------------|
| 23:15:59.1235000 | 1900-01-01 23:15:59.1235000 +00:00 |
+------------------+------------------------------------+

Saya mendeklarasikan @thetime variabel untuk menggunakan skala 4, tetapi kemudian menggunakan skala 7 saat mengonversinya ke datetimeoffset tipe data. Menggunakan presisi 7 tidak perlu, karena tidak dapat menggunakan presisi yang lebih tinggi dari yang sudah ditetapkan.

Selain itu, pembulatan presisi yang lebih rendah telah terjadi pada saat dikonversi ke (presisi lebih tinggi) datetimeoffset tipe data. Perhatikan bahwa waktu tipe data membulatkan pecahan detik dari nilai awal yang saya tetapkan. Efek pembulatan ini juga mengalir ke datetimeoffset nilai.

Contoh 3 – Konversi Eksplisit menggunakan CONVERT()

Berikut ini contoh menggunakan CONVERT() fungsi alih-alih CAST() .

DECLARE @thetime time;
SET @thetime = '23:15:59.1234567';
SELECT 
  @thetime AS 'time',
  CONVERT(datetimeoffset, @thetime) AS 'datetimeoffset';

Hasil:

+------------------+------------------------------------+
| time             | datetimeoffset                     |
|------------------+------------------------------------|
| 23:15:59.1234567 | 1900-01-01 23:15:59.1234567 +00:00 |
+------------------+------------------------------------+

Contoh 4 – Konversi Implisit

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

DECLARE @thetime time, @thedatetimeoffset datetimeoffset;
SET @thetime = '23:15:59.1234567';
SET @thedatetimeoffset = @thetime;
SELECT 
  @thetime AS 'time',
  @thedatetimeoffset AS 'datetimeoffset';

Hasil:

+------------------+------------------------------------+
| time             | datetimeoffset                     |
|------------------+------------------------------------|
| 23:15:59.1234567 | 1900-01-01 23:15:59.1234567 +00:00 |
+------------------+------------------------------------+

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

Contoh 5 – Ubah Tanggal

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

DECLARE @thetime time, @thedatetimeoffset datetimeoffset;
SET @thetime = '23:15:59.1234567';
SET @thedatetimeoffset = @thetime;
SET @thedatetimeoffset = DATEADD(year, 285, @thedatetimeoffset);
SELECT 
  @thetime AS 'time',
  @thedatetimeoffset AS 'datetimeoffset';

Hasil:

+------------------+------------------------------------+
| time             | datetimeoffset                     |
|------------------+------------------------------------|
| 23:15:59.1234567 | 2185-01-01 23:15:59.1234567 +00:00 |
+------------------+------------------------------------+

Dalam hal ini saya menambahkan 285 ke nilai tahun, sehingga menjadi 2185.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL:Pilih 3 Catatan Teratas + Jumlah Kuantitas

  2. Solusi untuk dukungan kursor bukanlah fitur yang diterapkan untuk kesalahan TDS SQL Server Parallel DataWarehousing

  3. Temukan objek yang rusak di SQL Server

  4. 4 Alasan Mengapa Anda Harus Memprioritaskan Pemantauan Database dalam Perencanaan 2020

  5. Bagaimana saya bisa mengotomatiskan tugas menghasilkan skrip di SQL Server Management Studio 2008?