Saya sedang melakukan beberapa pertanyaan pilih SQL dan ingin mengubah kolom waktu UTC saya menjadi waktu lokal untuk ditampilkan sebagai waktu lokal dalam hasil permintaan saya. Catatan, saya TIDAK ingin melakukan konversi ini melalui kode melainkan ketika saya melakukan query SQL manual dan acak terhadap database saya.
sql
sql-server
Nugs
sumber
sumber
Jawaban:
Anda dapat melakukan ini sebagai berikut pada SQL Server 2008 atau lebih tinggi:
Anda juga dapat melakukan lebih sedikit verbose:
Apa pun yang Anda lakukan, jangan gunakan
-
untuk mengurangi tanggal, karena operasi ini tidak bersifat atomik, dan Anda kadang-kadang akan mendapatkan hasil yang tidak ditentukan karena kondisi balapan antara waktu sistem dan waktu lokal yang diperiksa pada waktu yang berbeda (yaitu, non-atom) .Harap perhatikan bahwa jawaban ini tidak memperhitungkan DST. Jika Anda ingin menyertakan penyesuaian DST, silakan lihat juga pertanyaan SO berikut:
Cara membuat fungsi Start dan End Daylight Savings time di SQL Server
sumber
Saya tidak menemukan contoh ini membantu menyimpan datetime disimpan sebagai UTC ke datetime dalam zona waktu tertentu (BUKAN zona waktu server karena database Azure SQL dijalankan sebagai UTC). Beginilah cara saya menanganinya. Itu tidak elegan tetapi sederhana dan memberi Anda jawaban yang benar tanpa mempertahankan tabel lain:
sumber
AT TIME ZONE
sintaksis, pertimbangkan stackoverflow.com/a/44941536/112764 - Anda dapat mengaitkan beberapa konversi secara bersamaan dengan hanya menggabungkan beberapaat time zone <blah>
s.dateTimeField AT TIME ZONE 'UTC' AT TIME ZONE 'Eastern Standard Time'
- hanya merantaiAT TIME ZONE
pernyataan. (@NateJ menyebutkan ini di atas saya lihat sekarang)Jika waktu lokal Anda diucapkan
Eastern Standard Time
dan Anda ingin mengonversi dari UTC ke itu, maka di Azure SQL dan SQL Server 2016 dan di atasnya, Anda bisa melakukan:Daftar lengkap nama zona waktu dapat ditemukan dengan:
Dan ya, zona waktu diberi nama yang buruk - meskipun demikian
Eastern Standard Time
, penghematan siang hari diperhitungkan.sumber
Jika Anda memerlukan konversi selain lokasi server Anda, berikut adalah fungsi yang memungkinkan Anda untuk melewati offset standar dan akun untuk US Daylight Savings Times:
sumber
Menggunakan peluang SQL Server 2016 baru:
Tetapi prosedur CLR bekerja 5 kali lebih cepat: '- (
Perhatikan bahwa Offset untuk satu TimeZone dapat berubah ke waktu musim dingin atau musim panas. Sebagai contoh
hasil:
Anda tidak bisa hanya menambahkan offset konstan.
sumber
Jika mengaktifkan CLR pada basis data Anda merupakan opsi dan juga menggunakan zona waktu server sql, ini dapat ditulis dalam .Net dengan mudah.
Nilai datetime UTC masuk dan nilai datetime lokal relatif ke server keluar. Nilai kosong mengembalikan nol.
sumber
Tidak ada cara sederhana untuk melakukan ini dengan cara yang benar DAN generik.
Pertama-tama harus dipahami bahwa offset tergantung pada tanggal yang dimaksud, Zona Waktu DAN DST.
GetDate()-GetUTCDate
hanya memberi Anda offset hari ini di TZ server, yang tidak relevan.Saya hanya melihat dua solusi yang berfungsi dan saya telah banyak mencari.
1) Fungsi SQL khusus dengan beberapa tabel data dasar seperti Zona Waktu dan aturan DST per TZ. Bekerja tetapi tidak terlalu elegan. Saya tidak dapat memposting karena saya tidak memiliki kode.
EDIT: Ini adalah contoh metode ini https://gist.github.com/drumsta/16b79cee6bc195cd89c8
2) Tambahkan .net assembly ke db, .Net dapat melakukan ini dengan sangat mudah. Ini berfungsi dengan baik tetapi downside adalah bahwa Anda perlu mengkonfigurasi beberapa parameter pada tingkat server dan konfigurasi mudah rusak misalnya jika Anda mengembalikan database. Saya menggunakan metode ini tetapi saya tidak dapat mempostingnya karena saya tidak memiliki kode.
sumber
Tidak ada yang bekerja untuk saya tetapi di bawah ini bekerja 100%. Semoga ini bisa membantu orang lain yang mencoba mengubahnya seperti saya.
sumber
declare @StandardOffset int = datediff (hh, GETUTCDATE(), GETDATE())
Ini adalah versi yang menyumbang penghematan siang hari, offset UTC, dan tidak dikunci pada tahun tertentu.
sumber
Saya menemukan satu cara fungsi menjadi terlalu lambat ketika ada banyak data. Jadi saya melakukannya dengan bergabung ke fungsi tabel yang akan memungkinkan untuk perhitungan jam diff. Ini pada dasarnya adalah segmen datetime dengan offset jam. Setahun akan menjadi 4 baris. Jadi fungsi tabel
akan mengembalikan tabel ini:
Itu memperhitungkan penghematan siang hari. Contoh cara penggunaannya ada di bawah dan posting blog lengkapnya ada di sini .
sumber
sumber
Jawaban Ron mengandung kesalahan. Ini menggunakan 02:00 waktu setempat di mana setara UTC diperlukan. Saya tidak memiliki poin reputasi yang cukup untuk mengomentari jawaban Ron sehingga versi yang diperbaiki muncul di bawah:
sumber
Stempel waktu UNIX hanyalah jumlah detik antara tanggal tertentu dan Unix Epoch,
SELECT DATEDIFF (SECOND, {d '1970-01-01'}, GETDATE ()) // Ini Akan Mengembalikan cap waktu UNIX Dalam SQL server
Anda dapat membuat fungsi untuk tanggal lokal waktu untuk Unix UTC konversi menggunakan Country Offset Function ke Unix Time Stamp di SQL server
sumber
Itu mudah. Coba ini untuk Azure SQL Server:
Untuk SQL Server Lokal:
sumber
Untuk pengguna Azure SQL dan
@@Version
> = SQL Server 2016, Di bawah ini adalah fungsi sederhana yang digunakanAT TIME ZONE
.Untuk jenis nilai yang
@LocalTimeZone
dapat diambil, buka tautan ini atau KeKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones
sumber
Sebagai peringatan - jika Anda akan menggunakan yang berikut (perhatikan milidetik alih-alih menit):
Perlu diingat bahwa bagian DATEDIFF tidak akan selalu mengembalikan nomor yang sama. Jadi jangan gunakan untuk membandingkan DateTimes hingga milidetik.
sumber
Saya telah menemukan bahwa fungsi ini lebih cepat daripada solusi lain menggunakan tabel atau loop terpisah. Itu hanya pernyataan kasus dasar. Mengingat bahwa semua bulan antara April dan Oktober memiliki offset -4-jam (Waktu Timur), kita hanya perlu menambahkan beberapa garis kasus lagi untuk hari-hari pinggiran. Jika tidak, offset -5 jam.
Ini khusus untuk konversi dari UTC ke waktu Timur, tetapi fungsi zona waktu tambahan dapat ditambahkan sesuai kebutuhan.
sumber
Ini harus bisa mendapatkan waktu server dengan DST
sysdatetimeoffset memperhitungkan DST
sumber
Fungsi pertama: dikonfigurasikan untuk zona waktu Italia (+1, +2), berganti tanggal: minggu terakhir Maret dan Oktober, mengembalikan perbedaan antara zona waktu saat ini dan datetime sebagai parameter.
Kode tersebut adalah:
Kemudian fungsi yang mengonversi tanggal
sumber
- dapatkan waktu standar India dari utc
sumber
Ini bisa dilakukan tanpa fungsi. Kode di bawah ini akan mengonversi waktu UTC ke Waktu pegunungan yang menunjukkan penghematan siang hari. Sesuaikan semua angka -6 dan -7 dengan zona waktu Anda (untuk EST Anda akan menyesuaikan masing-masing ke -4 dan -5)
sumber
Anda harus memformat ulang string serta mengonversi ke waktu yang tepat. Dalam hal ini saya membutuhkan waktu Zulu.
sumber
Cara terbaik untuk Oracle:
Dengan datetime hardcoded:
Result:
2018-10-28 00:00
Dengan nama kolom dan tabel:
sumber
Saya memiliki kode untuk melakukan UTC ke Lokal dan Lokal ke kali UTC yang memungkinkan konversi menggunakan kode seperti ini
dan
Fungsi-fungsinya dapat mendukung semua atau sebagian dari zona waktu di IANA / TZDB seperti yang disediakan oleh NodaTime - lihat daftar lengkapnya di https://nodatime.org/TimeZones
Ketahuilah bahwa use case saya berarti saya hanya perlu jendela 'saat ini', memungkinkan konversi waktu dalam kisaran sekitar +/- 5 tahun dari sekarang. Ini berarti bahwa metode yang saya gunakan mungkin tidak cocok untuk Anda jika Anda memerlukan periode waktu yang sangat luas, karena cara itu menghasilkan kode untuk setiap interval zona waktu dalam rentang tanggal yang diberikan.
Proyek ini ada di GitHub: https://github.com/elliveny/SQLServerTimeConversion
Ini menghasilkan kode fungsi SQL seperti contoh ini
sumber
Nah jika Anda menyimpan data sebagai tanggal UTC dalam database Anda dapat melakukan sesuatu yang sederhana
ini selalu lokal dari titik server dan Anda tidak meraba-raba dengan AT
TIME ZONE 'your time zone name'
, jika database Anda dipindahkan ke zona waktu lain seperti instalasi klien zona waktu kode keras mungkin menggigit Anda.sumber
Dalam postgres ini bekerja dengan sangat baik .. Beritahu server waktu di mana waktu disimpan, 'utc', dan kemudian minta untuk mengonversi ke zona waktu tertentu, dalam hal ini 'Brasil / Timur'
Dapatkan daftar zona waktu lengkap dengan pilihan berikut;
Lihat detailnya di sini.
https://popsql.com/learn-sql/postgresql/how-to-convert-utc-to-local-time-zone-in-postgresql
sumber
Inilah yang lebih sederhana yang membawa pertama ke akun
sumber
SELECT DATEADD(MINUTE, DATEDIFF(MINUTE, GETUTCDATE(), '20150101'), GETDATE())
. Saya saat ini dalam CEST (UTC + 2), tetapi DST tidak akan berlaku pada hari Tahun Baru, jadi jawaban yang tepat untuk saya adalah 1 Januari 2015 01:00. Jawaban Anda, seperti jawaban yang diterima, mengembalikan 1 Januari 2015 02:00.