Mengapa zona waktu tidak bersifat deterministik?

18

SQL Server 2016 AT TIME ZONEtampaknya tidak deterministik. Namun, saya belum dapat menemukan dokumentasi yang secara resmi menyatakan ini atau memberikan alasan tentang alasan di baliknya.

Mengapa tidak AT TIME ZONEdeterministik?

Contoh Menampilkan Non-Determinisme

Mengeksekusi:

CREATE TABLE Test (
    LegacyTimestamp DATETIME,
    Timestamp AS LegacyTimestamp AT TIME ZONE 'Eastern Standard Time' PERSISTED
); 

Mengembalikan kesalahan berikut:

Msg 4936, Level 16, State 1, Line 1
Computed column 'Timestamp' in table 'Test' cannot be persisted because the column is non-deterministic.
Ben Gribaudo
sumber
4
Tiga kata. Waktu Musim Panas.
paparazzo
2
Selamat datang di mimpi buruk yang dikenal sebagai waktu. Saya hampir berharap itu wajib ketika Anda menyimpan waktu, Anda juga menyimpan zona waktu apa juga. Saya akan menghemat banyak dalam pengobatan sakit kepala.
Eric S
Baru saja membuat item Microsoft Connect yang meminta dokumentasi untuk diperbarui agar mencerminkan non-determinisme 'AT TIME ZONE.
Ben Gribaudo

Jawaban:

20

AT TIME ZONE menggunakan beberapa logika untuk menghitung Daylight Savings Time. Nilai offset DST tidak dapat diubah (mereka dapat berubah melalui pembaruan windows ) dan terkandung secara eksternal dalam registri Windows, sehingga AT TIME ZONEfungsi tersebut tidak dapat ditentukan karena bergantung pada data eksternal.

Demikian pula, inilah sebabnya mengapa sys.time_zone_infotampilan dan bukan tabel referensi statis, perlu dihitung tergantung pada nilai registri yang memiliki informasi zona waktu paling terbaru.

LowlyDBA
sumber
1
Tapi bukankah seharusnya dihitung dengan merujuk pada tanggal yang dikonversi? Jika ini non-deterministik, itu karena aturan hari mulai dari daylight saving dapat berubah di masa depan, seperti yang terjadi pada 2009.
Random832
@ Random832 Benar! Saya melewatkan beberapa detail untuk ini, saya telah memperbarui agar lebih jelas.
LowlyDBA
2
@ Random832, anggap tidak hanya tanggal yang lalu tetapi juga tanggal yang akan datang. Jika tanggal mendatang disimpan berdasarkan aturan perubahan waktu yang ada saat ini, nilai akan menjadi tidak valid jika aturan berubah antara sekarang dan kemudian,
Dan Guzman
1
John: ini info yang bagus, tetapi bukankah akan lebih akurat secara teknis untuk mengatur ulang ini sedikit untuk mengatakan bahwa alasan sebenarnya bahwa itu non-deterministik hanya karena ketergantungan eksternal pada mendapatkan informasi dari registri? Tentu, mengapa harus mendapatkan info dari sana yang bukan kode keras ke dalam kode aplikasi (yaitu penyebab root) sebagian besar karena seberapa sering aturan DST berubah, dan fakta bahwa Zona Waktu baru dapat diperkenalkan, tapi itu benar-benar sekunder, bukan? Tetapi terlepas dari "mengapa", setiap ketergantungan eksternal harus membuat fungsi apa pun menjadi non-deterministik.
Solomon Rutzky
1
Luar biasa! FYI, saya menemukan beberapa info yang agak menarik di sini - en.wikipedia.org/wiki/Tz_database - yang tampaknya merupakan salah satu dari sedikit dokumen (setidaknya yang dapat saya temukan sejauh ini) yang menunjukkan bahwa DST bukan satu-satunya hal Untuk mengganti. Dari apa yang saya tahu dari melihat file C: \ Windows \ Globalization \ Time Zone \ timezones.xml , bahkan offset dasar dapat berubah dari waktu ke waktu, meskipun lebih jarang sejak tahun 1970, saya kira. +1 :-) (harus
mem-posting
1

Saya telah menambahkan AT TIME ZONE ke daftar nondeterministic pada topik Deterministic dan Nondeterministic, dan dalam topik AT TIME ZONE, saya menambahkan: Karena beberapa informasi (seperti aturan zona waktu) dikelola di luar SQL Server dan dapat berubah sewaktu-waktu, fungsi AT TIME ZONE digolongkan sebagai nondeterministic. Terima kasih telah membicarakan ini. Rick Byham, SQL Server Buku Online.

Rick Byham menyiratkan tidak ada warrenty
sumber
2
Ini harus menjadi komentar daripada jawaban!
Kin Shah