ทำไมถึงเป็น TIME ZONE nondeterministic


18

AT TIME ZONEดูเหมือนว่าSQL Server 2016 จะเป็น nondeterministic อย่างไรก็ตามฉันไม่สามารถค้นหาเอกสารอย่างเป็นทางการที่ระบุสิ่งนี้หรือให้เหตุผลเกี่ยวกับเหตุผลที่อยู่เบื้องหลัง

ทำไมต้องเป็นAT TIME ZONEnondeterministic

ตัวอย่างที่แสดงให้เห็นถึงความไม่มุ่งมั่น

การดำเนินการ:

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

ส่งคืนข้อผิดพลาดต่อไปนี้:

Msg 4936, Level 16, State 1, Line 1
Computed column 'Timestamp' in table 'Test' cannot be persisted because the column is non-deterministic.

4
สามคำ เวลาออมแสง
paparazzo

2
ยินดีต้อนรับสู่ฝันร้ายที่เรียกว่าเวลา ฉันเกือบอยากให้มันเป็นข้อบังคับเมื่อคุณเก็บเวลาคุณยังเก็บเขตเวลาไว้ด้วย ฉันจะประหยัดยาปวดหัวได้มาก
Eric S

เพิ่งสร้างรายการ Microsoft Connect ที่ขอเอกสารเพื่อให้อัปเดตเพื่อสะท้อนถึง 'AT TIME ZONE'
Ben Gribaudo

คำตอบ:


20

AT TIME ZONE ใช้ตรรกะบางอย่างเพื่อคำนวณเวลาออมแสง ค่าออฟเซ็ต DST จะไม่เปลี่ยนรูป (อาจเปลี่ยนแปลงได้ผ่านการอัพเดท windows ) และมีอยู่ภายนอกในรีจิสทรีของ Windows ดังนั้นจึงAT TIME ZONEไม่สามารถกำหนดฟังก์ชันได้เนื่องจากอาศัยข้อมูลภายนอก

ในทำนองเดียวกันนี่คือเหตุผลที่sys.time_zone_infoเป็นมุมมองและไม่ใช่ตารางการอ้างอิงแบบคงที่มันจะต้องมีการคำนวณขึ้นอยู่กับค่ารีจิสทรีที่มีข้อมูลเขตเวลาที่ทันสมัยที่สุด


1
แต่ไม่ควรคำนวณตามวันที่ที่แปลง หากไม่ได้กำหนดไว้ก็เป็นเพราะกฎของการประหยัดเวลากลางวันอาจเริ่มเปลี่ยนแปลงในอนาคตเช่นเดียวกับในปี 2009
Random832

@ Random832 ถูกต้อง! ฉันข้ามรายละเอียดบางอย่างไปฉันได้อัปเดตให้ชัดเจนยิ่งขึ้น
LowlyDBA

2
@ Random832 พิจารณาไม่เฉพาะวันที่ผ่านมา แต่วันที่ในอนาคต หากมีการจัดเก็บวันที่ในอนาคตตามกฎการเปลี่ยนแปลงเวลาที่มีอยู่ในปัจจุบันค่าจะไม่ถูกต้องหากกฎมีการเปลี่ยนแปลงระหว่างตอนนี้และตอนนั้น
Dan Guzman

1
จอห์น: นี่เป็นข้อมูลที่ดี แต่จะไม่แม่นยำกว่าหรือไม่ที่จะจัดเรียงสิ่งนี้ใหม่อีกเล็กน้อยเพื่อพูดว่าเหตุผลที่แท้จริงที่ไม่สามารถกำหนดได้นั้นเป็นเพราะการพึ่งพาจากภายนอกในการรับข้อมูลจากรีจิสทรี แน่นอนว่าทำไมมันถึงได้รับข้อมูลจากที่นั่นแทนที่จะเป็นรหัสฮาร์ดโค้ดในแอพ (เช่นสาเหตุที่แท้จริง) ส่วนใหญ่เกิดจากการที่กฎ DST เปลี่ยนแปลงบ่อยครั้งและความจริงที่ว่าเขตเวลาใหม่สามารถนำมาใช้ได้ แต่นั่นเป็นเรื่องรองจริงไหม แต่ไม่คำนึงถึง "ทำไม" การพึ่งพาภายนอกใด ๆ ควรทำให้ฟังก์ชันใด ๆ
โซโลมอน Rutzky

1
! น่ากลัว FYI ฉันพบข้อมูลที่น่าสนใจบ้างที่นี่ - en.wikipedia.org/wiki/Tz_database - ซึ่งดูเหมือนว่าจะเป็นหนึ่งในเอกสารไม่กี่ฉบับ (อย่างน้อยก็หาได้จนถึงตอนนี้) ที่ระบุว่า DST ไม่ใช่สิ่งเดียว เพื่อเปลี่ยน. จากสิ่งที่ฉันสามารถบอกได้จากการดูที่ไฟล์C: \ Windows \ Globalization \ Time Zone \ timezones.xmlแม้แต่การออฟเซ็ตพื้นฐานก็สามารถเปลี่ยนแปลงได้ตลอดเวลาแม้จะน้อยกว่าตั้งแต่ปี 1970 ก็ตามฉันเดาว่า +1 :-) (ต้องโพสต์สิ่งนี้ใหม่เนื่องจากลิงก์มีตัวละครที่ไม่ดีอยู่ในนั้น)
โซโลมอน Rutzky

1

ฉันเพิ่ม AT TIME ZONE ในรายการ nondeterministic ในหัวข้อ Deterministic และ Nondeterministic และในหัวข้อ AT TIME ZONE ฉันเพิ่ม: เนื่องจากข้อมูลบางอย่าง (เช่นกฎเขตเวลา) อยู่นอก SQL Server และอาจมีการเปลี่ยนแปลงเป็นครั้งคราว ฟังก์ชัน AT TIME ZONE จัดเป็น nondeterministic ขอบคุณที่นำสิ่งนี้มา Rick Byham, SQL Server Books Online


2
นี่ควรเป็นความคิดเห็นมากกว่าคำตอบ!
Kin Shah
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.