2008-10-07 7 views
5

Veritabanı uygulamam farklı saat dilimlerinde birden çok siteye dağıtılacak.T-SQL'de Saat Dilimi Kaybını Belirle

YTD hesaplamaları için bu yılın 1 Ocak tarihli gece yarısı UTC zaman damgasını belirleyecek bir T-SQL işlevine ihtiyacım var. Tüm veriler UTC zaman damgalarında saklanır. Örneğin, Chicago, Günışığı Tasarruf Zamanı (DST) ile UTC-6'dır, Chicago'da 2008'de herhangi bir zamanda çalıştırılacaksa, fonksiyonun '2008-01-01 06:00:00' dönmesi gerekir. Gelecek yıl New York'ta (GMT-5 + DST) koşuyorsanız, '2009-01-01 05:00:00' dönmelidir.

Geçerli yılı YEAR (GETDATE()) 'dan alabilirim. Ofsetin belirlenmesi için GETDATE() ve GETUTCDATE() arasında bir DATEDIFF yapabileceğimi düşündüm, ancak sonucun DST sırasında çalıştırılıp çalıştırılmadığına bağlı olarak değişir. Ofsetin belirlenmesinde veya mevcut zamanın DST olup olmadığını anlamak için yerleşik T-SQL fonksiyonlarını bilmiyorum.

Bu sorunun T-SQL'de bir çözümü var mı? Bunu kodlayabilir veya bir masada saklayabilirim ama yapmamayı tercih ederim. Bu SQL Server 2005'te CLR Entegrasyonu kullanmak için mükemmel bir durum olduğunu varsayalım. Sadece habersiz bir T-SQL çözümü olup olmadığını merak ediyorum?

cevap

2

Kontrol dışarı bu önceki soru ve ilgili için cevap bilgi:

Effectively Converting dates between UTC and Local (ie. PST) time in SQL 2005

(. Eğer biz zaman dilimleri ile biraz yardım almak SQL Server sonraki sürümünde SQL Server 2005'te saat dilimi ve DST tabloları oluşturmak gerekiyor özetlemek gerekirse)

+0

Teşekkürler Eric. Geçmişte önerdiğiniz gibi masa tabanlı bir çözüm uyguladık. Sadece hayatımı kolaylaştırmak için kaçırdığım bir şey olup olmadığını merak ediyordum. –

0

Hm, sanırım sorunu anlamıyorum. Veritabanı uygulaması zaten tüm işlemleri için UTC zaman damgası saklıyorsa ve yılın ilk "yerel saatinden" beri bazı değerleri toplamak istiyorsanız, durumunuz şu gibi bir şey olmalıdır:

(timestamp + (getUTCDate() - getdate()) datetime olarak)> dökme ('01/01/2008')

DST yılda sorgu çalıştırıldığında bağlı kapalı üzerinde veya olabilir - ama getdate() bunu hesaba katar, böylece her seferinde ofseti dinamik olarak hesaplamanız gerekir. Yanılmıyorsam

ben ... düşünmek

... :-)

+0

Ofset, gelecekteki arbritrary bir tarihe değil, geçerli tarihe göre olacaktır. Ayrıca, istemcinin değil, sunucunun saat dilimine göre olur. – neonski

0

, getUTCDate() işlevi sunucuda tanımlı saat dilimini kullanır - bu müşterinin zaman dilimini hakkında bilgisi yoktur (ya da herhangi bir zaman dilimi). Bu bilgilerin SQL Server 2005'te herhangi bir yerde saklandığını düşünmüyorum, bu da bu bilgilerin hesaplanmasını imkansız kılıyor.

Belki de Oracle's time zone file'dan verileri ödünç alabilir ve kendi SQL Server işlevinizi oluşturabilirsiniz?

konu Kapalı (başkasına faydalı olabilir) ama Oracle kullanarak olsaydı, 'ZAMAN BÖLGEDE' FROM_TZ fonksiyonu ve kullanabilirsiniz:

FROM_TZ(YOUR_TIMESTAMP, 'UTC') AT TIME ZONE 'America/Dawson_Creek'