Saat ini saya menggunakan yang berikut ini untuk mendapatkan datetime lokal dari datetime UTC:
SET @offset = DateDiff(minute, GetUTCDate(), GetDate())
SET @localDateTime = DateAdd(minute, @offset, @utcDateTime)
Masalah saya adalah bahwa jika penghematan waktu siang hari terjadi antara GetUTCDate()
dan @utcDateTime
, @localDateTime
ujungnya menjadi satu jam libur.
Apakah ada cara mudah untuk mengkonversi dari utc ke waktu lokal untuk tanggal yang bukan tanggal saat ini?
Saya menggunakan SQL Server 2005
WITH PERMISSION_SET = UNSAFE
. Beberapa lingkungan tidak mengizinkannya seperti AWS RDS. Dan itu, yah, tidak aman. Sayangnya, tidak ada implementasi zona waktu lengkap. Net yang dapat digunakan tanpaunsafe
izin. Lihat di sini dan di sini .Saya telah mengembangkan dan menerbitkan proyek T-SQL Toolbox pada codeplex untuk membantu siapa saja yang berjuang dengan penanganan waktu dan zona waktu di Microsoft SQL Server. Ini open source dan sepenuhnya gratis untuk digunakan.
Ini menawarkan UDFs konversi datetime mudah menggunakan T-SQL polos (tidak ada CLR) di samping dengan tabel konfigurasi pra-diisi di luar kotak. Dan memiliki dukungan DST (daylight saving time) penuh.
Daftar semua zona waktu yang didukung dapat ditemukan dalam tabel "DateTimeUtil.Timezone" (disediakan dalam basis data T-SQL Toolbox).
Dalam contoh Anda, Anda dapat menggunakan sampel berikut:
Ini akan mengembalikan nilai datetime lokal yang dikonversi.
Sayangnya, ini didukung untuk SQL Server 2008 atau yang lebih baru hanya karena tipe data yang lebih baru (DATE, TIME, DATETIME2). Tetapi karena kode sumber lengkap disediakan, Anda dapat dengan mudah menyesuaikan tabel dan UDF dengan menggantinya dengan DATETIME. Saya tidak memiliki MSSQL 2005 yang tersedia untuk pengujian, tetapi itu harus bekerja dengan MSSQL 2005 juga. Jika ada pertanyaan, beri tahu saya.
sumber
Saya selalu menggunakan perintah TSQL ini.
Ini sangat sederhana dan berhasil.
sumber
Saya menemukan jawaban ini di StackOverflow yang menyediakan Fungsi yang Ditentukan Pengguna yang tampaknya secara akurat menerjemahkan datetimes
Satu-satunya hal yang perlu Anda modifikasi adalah
@offset
variabel di bagian atas untuk mengaturnya ke Timezone ofset dari SQL server yang menjalankan fungsi ini. Dalam kasus saya, server SQL kami menggunakan EST, yaitu GMT - 5Ini tidak sempurna dan mungkin tidak akan berfungsi untuk banyak kasus seperti memiliki offset TZ setengah jam atau 15 menit (bagi mereka saya akan merekomendasikan fungsi CLR seperti yang disarankan Kevin ), namun itu berfungsi cukup baik untuk sebagian besar zona waktu umum di Utara Amerika.
sumber
Untuk SQL Server 2016+, Anda dapat menggunakan SAAT ZONA SAAT . Secara otomatis akan menangani waktu penghematan cahaya siang hari.
sumber
Ada beberapa jawaban bagus untuk pertanyaan serupa yang diajukan di Stack Overflow. Saya akhirnya menggunakan pendekatan T-SQL dari jawaban kedua oleh Bob Albright untuk membersihkan kekacauan yang disebabkan oleh konsultan konversi data.
Ini bekerja untuk hampir semua data kami, tetapi kemudian saya menyadari bahwa algoritmanya hanya berfungsi untuk tanggal sejauh 5 April 1987 , dan kami memiliki beberapa tanggal dari tahun 1940-an yang masih belum dikonversi dengan benar. Kami akhirnya membutuhkan
UTC
tanggal dalam database SQL Server kami untuk sejalan dengan algoritma dalam program pihak ke-3 yang menggunakan Java API untuk mengkonversi dariUTC
ke waktu lokal.Saya suka
CLR
contoh dalam jawaban Kevin Feasel di atas menggunakan contoh Harsh Chawla, dan saya juga ingin membandingkannya dengan solusi yang menggunakan Java, karena ujung depan kami menggunakan Jawa untuk melakukanUTC
konversi waktu ke waktu lokal.Wikipedia menyebutkan 8 amandemen konstitusi berbeda yang melibatkan penyesuaian zona waktu sebelum 1987, dan banyak dari mereka sangat terlokalisasi untuk negara yang berbeda, sehingga ada kemungkinan bahwa CLR dan Jawa dapat menafsirkannya secara berbeda. Apakah kode aplikasi front-end Anda menggunakan dotnet atau Java, atau tanggal sebelum 1987 masalah bagi Anda?
sumber
Anda dapat dengan mudah melakukan ini dengan Prosedur Tersimpan CLR.
Anda dapat menyimpan Zona Waktu yang tersedia di tabel:
Dan prosedur tersimpan ini akan mengisi tabel dengan zona waktu yang memungkinkan pada server Anda.
sumber
WITH PERMISSION_SET = UNSAFE
. Beberapa lingkungan tidak mengizinkannya seperti AWS RDS. Dan itu, yah, tidak aman. Sayangnya, tidak ada implementasi zona waktu lengkap. Net yang dapat digunakan tanpaunsafe
izin. Lihat di sini dan di sini .SQL Server versi 2016 akan menyelesaikan masalah ini sekali dan untuk semua . Untuk versi sebelumnya, solusi CLR mungkin paling mudah. Atau untuk aturan DST tertentu (seperti AS saja), fungsi T-SQL bisa relatif sederhana.
Namun, saya pikir solusi T-SQL generik mungkin dilakukan. Selama
xp_regread
bekerja, coba ini:Fungsi T-SQL (kompleks) dapat menggunakan data ini untuk menentukan offset yang tepat untuk semua tanggal selama aturan DST saat ini.
sumber
sumber
Berikut adalah jawaban yang ditulis untuk aplikasi UK tertentu dan berdasarkan murni pada SELECT.
Tidak berlaku antara tengah malam dan 01:00 pada hari mulai siang hari dimulai. Ini bisa diperbaiki tetapi aplikasi yang ditulis untuk itu tidak memerlukannya.
sumber