แปลง DateTimeOffset ของเซิร์ฟเวอร์ SQL เป็นโซนเวลา

เป็นไปได้หรือไม่ใน SQL Server Query ที่จะแปลง datetimeoffset เป็นเขตเวลาที่เกี่ยวข้อง ตัวอย่างเช่น ฉันมีค่าที่เก็บไว้เป็น:

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

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

ฉันต้องการให้แบบสอบถาม sql ของฉันแสดง -06:00 เป็น CST หรือ CDT และ -05:00 เป็น EST หรือ EDT หากการปรับเวลาตามฤดูกาลมีผลอยู่

ฉันกำลังเขียนโค้ด RSS Feed โดยที่ฉันต้องการให้คอลัมน์ชุดผลลัพธ์แสดงในที่สุด:

ศ. 02 ม.ค. 2558 เวลา 18:30 น. CST

ศุกร์ที่ 09 ม.ค. 2558 18:30 น. EDT

ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชมอย่างมาก. ขอบคุณ!


person behofmann    schedule 04.01.2017    source แหล่งที่มา
comment
เพราะเหตุใดจึงเป็น -06:00 CST อาจเป็นเขตเวลาที่ถูกต้องใดก็ได้ คุณต้องการเฉพาะเขตเวลาของสหรัฐอเมริกาหรือไม่? คุณสามารถใช้ DATEPART(TZoffest, YourDate) และนิพจน์กรณีและปัญหาได้   -  person Sean Lange    schedule 04.01.2017
comment
SQL Server ไม่มีฟังก์ชันในตัวที่ส่งกลับชื่อโซนเวลาของ DateTimeOffset คุณต้องสร้างฟังก์ชันดังกล่าวหรือจัดรูปแบบในแอปพลิเคชันที่ใช้งานหนัก   -  person Wagner DosAnjos    schedule 04.01.2017
comment
@wdosanjos สิ่งนี้ไม่ต้องการฟังก์ชั่น หากมีเฉพาะเขตเวลาของสหรัฐอเมริกา นิพจน์กรณีธรรมดาก็สามารถจัดการเรื่องนี้ได้อย่างง่ายดาย   -  person Sean Lange    schedule 04.01.2017
comment
ขอบคุณสำหรับการตอบกลับของคุณ. ฉันจะมีรายการ/ออฟเซ็ตเวลาระหว่างประเทศ ดังนั้นฉันจึงต้องการแสดงออฟเซ็ตเป็นชื่อโซนเวลาที่เกี่ยวข้องได้ ฉันควรสร้างตารางโซนเวลาที่ออฟเซ็ตเป็นคีย์ในการแยกออฟเซ็ตและทำการเข้าร่วมหรือไม่   -  person behofmann    schedule 04.01.2017
comment
@behofmann วิธีแก้ปัญหานั้นซับซ้อนกว่าเพราะคุณต้องคำนึงถึงกฎการปรับเวลาตามฤดูกาลในเขตเวลาต่างๆ   -  person Wagner DosAnjos    schedule 04.01.2017
comment
@behofmann โปรดทราบว่ากฎการปรับเวลาตามฤดูกาลเปลี่ยนแปลงไปตามกาลเวลา ดังนั้นอัลกอริทึมที่แม่นยำจะต้องคำนึงถึงสิ่งนั้นเพื่อจัดการวันที่/เวลาก่อนหน้าอย่างถูกต้อง   -  person Wagner DosAnjos    schedule 04.01.2017
comment
ฉันมีตารางตำแหน่งที่มีคีย์นอกเป็นคีย์หลักในตารางโซนเวลา ด้วยเหตุนี้ ฉันจึงสามารถรับชื่อโซนเวลาที่เชื่อมโยงกับสถานที่ได้   -  person behofmann    schedule 05.01.2017
comment
รายการของฉันจะถูกจัดเก็บด้วยคอลัมน์ datetimeoffset ตามเวลา GMT เมื่อคิดถึง CST Daylight Savings (DST) ค่าชดเชยจะเปลี่ยนไป 60 นาที แต่เวลาไม่เปลี่ยนแปลง การลบ 60 นาทีสำหรับ DST จาก GMT จะทำให้ฉันตั้งเวลาผิด ดังที่ฉันเห็นตอนนี้ ฉันจะเปลี่ยนชื่อโซนเวลาจาก CST เป็น CDT ฉันคิดถูกหรือเปล่า?   -  person behofmann    schedule 05.01.2017


คำตอบ (2)


นี่คือตัวอย่างวิธีที่คุณสามารถทำได้โดยใช้ DATEPART หากคุณต้องการเขตเวลาเพิ่มเติม คุณอาจจำเป็นต้องใช้ตารางค้นหาและรวมค่าของ DATEPART โปรดทราบว่าแต่ละออฟเซ็ตจะมีเขตเวลาหลายเขต สิ่งเหล่านั้นจะแตกต่างกันไปตามละติจูด

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
น่าเสียดายที่สิ่งนี้ไม่ได้คำนึงถึงเวลาออมแสงด้วย - person Wagner DosAnjos; 04.01.2017
comment
ข้อดี @wdosanjos และแน่นอนว่าแทบจะเป็นไปไม่ได้เลยที่จะทำเช่นนี้แม้จะปิดตัวลงเมื่อได้รับข้อมูลตัวอย่างที่ให้มา เนื่องจากสถานที่/ประเทศ/รัฐบางแห่งไม่ได้ใช้เวลาออมแสง คุณจะต้องขยายเวลานี้ให้มากขึ้นเพื่อรองรับเวลาระหว่างประเทศตามที่แนะนำ และผลลัพธ์ที่แม่นยำใดๆ จะต้องอาศัยข้อมูลมากกว่าการชดเชยวันที่และเวลา คุณจะต้องทราบตำแหน่งด้วยจึงจะสามารถกำหนดเวลาที่แม่นยำได้ ไม่แน่ใจว่าจำเป็นต้องใช้ 100% ที่นี่หรือไม่ แต่ก็คุ้มค่าที่จะกล่าวถึงอย่างแน่นอน - person Sean Lange; 04.01.2017

เมื่อฉันต้องทำงานนี้ ฉันพบว่าตัวเลือกเดียวที่ใช้งานได้จริงคือบันทึกวันที่/เวลาทั้งหมดเป็น UTC และรวมตัวบ่งชี้เขตเวลาที่เชื่อมโยงกับตารางที่แสดงเมื่อเขตเวลาใดๆ เปลี่ยนแปลง เช่น เวลาออมแสง เกิดขึ้น สิ่งนี้จะต้องมีรหัสที่กำหนดเองสำหรับข้อมูลของคุณ

โชคดีที่มีคนเก็บรักษาฐานข้อมูลของข้อมูลเขตเวลา รวมถึงการเปลี่ยน DST และอื่นๆ ที่คล้ายกัน - ฐานข้อมูลเขตเวลาของ IANA. คุณสามารถใช้และอัปเดตข้อมูลดิบได้ด้วยตัวเอง หรือดูตัวอย่างอื่นๆ เกี่ยวกับวิธีการทำเช่นนี้ รวมถึง SQL Server โครงการสนับสนุนเขตเวลาบน GitHub

ในท้ายที่สุด UTC เขตเวลา และฐานข้อมูลการแปลงเป็นวิธีเดียวที่จะรับประกันความแม่นยำที่สมบูรณ์แบบและความสามารถในการแปลงเวลาระหว่างเขตเวลา โดยเฉพาะอย่างยิ่ง TZ ที่หายากซึ่งใช้เวลา 15 นาทีหรือ 1/2 ชั่วโมงจาก UTC

person Laughing Vergil    schedule 04.01.2017