Konversikan SQL Server DateTimeOffset ke Zona Waktu

Apakah mungkin dalam Kueri SQL Server untuk mengonversi offset waktu ke zona waktu yang sesuai? Misalnya, saya memiliki nilai yang disimpan sebagai:

2015-01-03 00:30 -06:00

2015-01-10 00:30 -05:00

Saya ingin kueri sql saya menampilkan -06:00 sebagai CST atau CDT dan -05:00 sebagai EST atau EDT jika waktu musim panas berlaku.

Saya mengkodekan Umpan RSS yang pada akhirnya saya ingin kolom kumpulan hasil saya ditampilkan:

Jum, 02 Jan 2015 18:30 CST

Jum, 09 Jan 2015 18:30 EST

Bantuan apa pun akan sangat dihargai. Terima kasih!


person behofmann    schedule 04.01.2017    source sumber
comment
Mengapa -06:00 CST? Ini bisa berupa salah satu dari sejumlah zona waktu yang valid. Apakah Anda hanya menginginkan zona waktu AS? Anda dapat menggunakan DATEPART(TZoffest, YourDate) dan ekspresi kasus.   -  person Sean Lange    schedule 04.01.2017
comment
SQL Server tidak menyediakan fungsi bawaan apa pun yang mengembalikan nama zona waktu DateTimeOffset. Anda juga perlu membuat fungsi seperti itu atau melakukan pemformatan pada aplikasi yang digunakan.   -  person Wagner DosAnjos    schedule 04.01.2017
comment
@wdosanjos ini tidak memerlukan fungsi. Jika hanya ada zona waktu AS, ekspresi kasus sederhana dapat menangani hal ini dengan mudah.   -  person Sean Lange    schedule 04.01.2017
comment
Terima kasih atas balasan Anda. Saya akan memiliki entri/offset waktu internasional jadi saya ingin dapat menampilkan offset sebagai nama zona waktu yang sesuai. Haruskah saya membuat tabel zona waktu di mana offset adalah kunci yang mengekstraksi offset dan melakukan penggabungan?   -  person behofmann    schedule 04.01.2017
comment
@behofmann solusinya lebih kompleks, karena Anda perlu memperhitungkan aturan waktu musim panas di berbagai zona waktu.   -  person Wagner DosAnjos    schedule 04.01.2017
comment
@behofmann perhatikan bahwa aturan waktu musim panas berubah seiring waktu, jadi algoritme yang tepat harus mempertimbangkan hal tersebut untuk menangani tanggal/waktu sebelumnya dengan benar.   -  person Wagner DosAnjos    schedule 04.01.2017
comment
Saya memiliki tabel lokasi yang memiliki kunci asing ke kunci utama dalam tabel zona waktu. Dengan ini, saya bisa mendapatkan nama zona waktu yang terkait dengan suatu lokasi.   -  person behofmann    schedule 05.01.2017
comment
Entri saya disimpan dengan kolom datetimeoffset berdasarkan GMT. Ketika memikirkan tentang CST Daylight Saving (DST) misalnya, offsetnya berubah 60 menit, TETAPI waktunya tidak berubah. Mengurangi 60 menit DST dari GMT akan memberi saya waktu yang salah. Seperti yang saya lihat sekarang, saya hanya akan mengubah nama zona waktu dari CST menjadi CDT. Apakah aku berpikir dengan benar?   -  person behofmann    schedule 05.01.2017


Jawaban (2)


Berikut adalah contoh bagaimana Anda dapat melakukan ini menggunakan DATEPART. Jika Anda memerlukan lebih banyak zona waktu maka Anda mungkin perlu menggunakan tabel pencarian dan menggabungkan nilai DATEPART. Namun perlu diingat bahwa ada beberapa zona waktu untuk setiap offset. Hal ini akan bervariasi berdasarkan garis lintang.

create table #TimeZoneExample
(
    MyDateTimeOffset datetimeoffset
)

insert #TimeZoneExample
select '2015-01-03 00:30 -06:00' union all
select '2015-01-10 00:30 -05:00'

select convert(datetime, MyDateTimeOffset) as PostDate
    , case DATEPART(TZoffset, MyDateTimeOffset)/60 
        when -5 then 'EST'
        when -6 then 'CST'
        when -7 then 'MST'
        when -8 then 'PST'
        else 'Unknown Time Zone'
    end
from #TimeZoneExample

drop table #TimeZoneExample
person Sean Lange    schedule 04.01.2017
comment
Sayangnya, hal ini tidak memperhitungkan waktu musim panas. - person Wagner DosAnjos; 04.01.2017
comment
Poin bagus @wdosanjos dan tentu saja hampir tidak mungkin untuk melakukan ini meskipun mengingat contoh informasi yang diberikan karena tidak semua lokasi/negara/negara bagian menggunakan waktu musim panas. Anda perlu memperluasnya secara signifikan untuk mengakomodasi waktu internasional seperti yang disarankan. Dan hasil akurat apa pun akan memerlukan lebih banyak informasi daripada sekadar penggantian tanggal dan waktu. Anda juga perlu mengetahui lokasinya agar dapat menentukan waktu yang akurat. Tidak yakin apakah 100% diperlukan di sini tetapi tentu saja layak untuk disebutkan. - person Sean Lange; 04.01.2017

Ketika saya harus mengerjakan ini, saya menyadari bahwa satu-satunya pilihan yang benar-benar berfungsi adalah menyimpan semua tanggal/waktu sebagai UTC, dan menyertakan indikator zona waktu yang terkait dengan tabel yang menunjukkan kapan zona waktu berubah, seperti waktu musim panas, terjadi. Ini akan memerlukan kode khusus untuk data Anda.

Untungnya, seseorang memelihara database data zona waktu termasuk transisi DST dan sejenisnya - IANA Time Zone DB. Anda dapat menggunakan dan memperbarui data mentah sendiri, atau mencari contoh lain tentang cara melakukan hal ini, termasuk SQL Server Proyek Dukungan Zona Waktu di GitHub.

Pada akhirnya, UTC, Zona Waktu, dan basis data konversi adalah satu-satunya cara untuk memastikan akurasi sempurna DAN kemampuan konversi waktu antar zona waktu - terutama TZ langka yang berjarak 15 menit atau 1/2 jam shift dari UTC.

person Laughing Vergil    schedule 04.01.2017