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

Konversi waktu tanggal dari zona waktu ke zona waktu di server sql

Stempel waktu Unix adalah bilangan bulat detik sejak 1 Januari 1970 UTC.

Dengan asumsi Anda berarti Anda memiliki kolom bilangan bulat di database Anda dengan nomor ini, maka zona waktu server database Anda tidak relevan.

Pertama-tama konversikan stempel waktu menjadi datetime ketik:

SELECT DATEADD(second, yourTimeStamp, '1970-01-01')

Ini akan menjadi datetime UTC yang sesuai dengan stempel waktu Anda.

Maka Anda perlu tahu cara menyesuaikan nilai ini dengan zona waktu target Anda. Di sebagian besar dunia, satu zona dapat memiliki beberapa offset, karena Waktu Musim Panas.

Sayangnya, SQL Server tidak memiliki kemampuan untuk bekerja di zona waktu secara langsung. Jadi jika Anda, misalnya, menggunakan waktu Pasifik AS, Anda tidak akan tahu apakah Anda harus mengurangi 7 jam atau 8 jam. Basis data lain (Oracle, Postgres, MySql, dll.) Memiliki cara bawaan untuk menangani ini, tetapi sayangnya, SQL Server tidak. Jadi, jika Anda mencari solusi tujuan umum, Anda perlu melakukan salah satu hal berikut:

  • Impor data zona waktu ke dalam tabel, dan pertahankan tabel tersebut saat aturan zona waktu berubah. Gunakan tabel itu dengan sekumpulan logika khusus untuk menyelesaikan offset untuk tanggal tertentu.

  • Gunakan xp_regread untuk mendapatkan kunci registri Windows yang berisi data zona waktu, dan sekali lagi menggunakan banyak logika khusus untuk menyelesaikan offset untuk tanggal tertentu. Tentu saja, xp_regread adalah hal yang buruk untuk dilakukan, memerlukan izin tertentu yang diberikan, dan tidak didukung atau didokumentasikan.

  • Tulis fungsi SQLCLR yang menggunakan TimeZoneInfo kelas di .Net. Sayangnya, memerlukan perakitan SQLCLR "tidak aman" , dan dapat menyebabkan hal buruk terjadi.

IMHO, tidak satu pun dari pendekatan ini yang sangat baik, dan tidak ada solusi yang baik untuk melakukan ini secara langsung di SQL. Solusi terbaik adalah mengembalikan nilai UTC (baik bilangan bulat asli, atau datetime di UTC) ke kode aplikasi panggilan Anda, dan lakukan konversi zona waktu di sana (dengan, misalnya, TimeZoneInfo di .Net atau mekanisme serupa di platform lain).

NAMUN - Anda beruntung karena Kuwait (dan selalu) berada di zona yang tidak berubah untuk Waktu Musim Panas. Itu selalu UTC+03:00. Jadi Anda cukup menambahkan tiga jam dan mengembalikan hasilnya:

SELECT DATEADD(hour, 3, DATEADD(second, yourTimeStamp, '1970-01-01'))

Namun ketahuilah bahwa ini bukan solusi tujuan umum yang akan bekerja di zona waktu mana pun.

Jika mau, Anda bisa mengembalikan salah satu tipe data SQL lainnya, seperti datetimeoffset , tetapi ini hanya akan membantu Anda mencerminkan bahwa nilainya diimbangi dengan tiga jam bagi siapa pun yang mungkin melihatnya. Itu tidak akan membuat proses konversi menjadi berbeda atau lebih baik.

Jawaban yang Diperbarui

Saya telah membuat proyek untuk mendukung zona waktu di SQL Server. Anda dapat menginstalnya dari sini . Kemudian Anda cukup mengonversi seperti ini:

SELECT Tzdb.UtcToLocal('2015-07-01 00:00:00', 'Asia/Kuwait')

Anda dapat menggunakan zona waktu mana pun dari basis data IANA tz , termasuk yang menggunakan waktu musim panas.

Anda masih dapat menggunakan metode yang saya tunjukkan di atas untuk mengonversi dari cap waktu unix. Menyatukan keduanya:

SELECT Tzdb.UtcToLocal(DATEADD(second, yourTimeStamp, '1970-01-01'), 'Asia/Kuwait')

Diperbarui Lagi

Dengan SQL Server 2016, sekarang ada dukungan bawaan untuk zona waktu dengan AT TIME ZONE penyataan. Ini juga tersedia di Azure SQL Database (v12).

SELECT DATEADD(second, yourTimeStamp, '1970-01-01') AT TIME ZONE 'Arab Standard Time'

Contoh lainnya dalam pengumuman ini.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana menemukan tabel dependen melingkar di sql server

  2. Apa itu Stored Procedure dan Mengapa Stored Procedure?

  3. Permintaan SQL Server - hitung ketersediaan kamar

  4. Memeriksa param input jika bukan Null dan menggunakannya di mana di SQL Server

  5. batasan kunci asing SQL DROP TABLE