2011-06-22 14 views
6

ile yapıyorum. Yardıma ihtiyacım var.UTC, TimeZone ile başa çıkma ve GROUPTB'yi LocalTime

UTC tarihlerini veritabanında saklıyorum.

Örnek satırlar:

GeneratedAt:

  • 2011-06-08 23:30
  • 2011-06-09 03:30
  • 2011-06-09 15:30

Kullanıcımın yerel saati -2 saattir (Orta Avrupa). 09'dan satırları istediğimde 3 satırım var.

Sorun, GROUP BY günüyle raporlama amaçlıdır. 08 için 2 ve 09 için 2 var ama bu yerel saat için doğru değil. Gördüğüm heryerde: "verileri UTC'de sakla" yı görüyorum. Bu nasıl düzgün yapılır?

GÜNCELLEME 1:
veri erişimi için ben NHibernate kullanıyorum ve veritabanı motorunun bağımsız çözümü tercih. Yani, Tarih/Zaman Boyut tablosu gibi bir şey (veya böyle bir şey) ile çözüm arıyorum.

Benim veri tablosu şöyle sütun vardır:

  • GeneratedAt (datetime)
  • GeneratedAt_Year (int)
  • GeneratedAt_Month (int)
  • GeneratedAt_Day (int)
  • GeneratedAt_Hour (int)

Bu sayede kolayca g tarafından rouping: yıl, yıl + ay, yıl + ay + gün, yıl + ay + gün + saat. Ne yazık ki bu UTC. :(kullanıcı saat dilimleri başa bu çözümü refactor nasıl

?

Bir DATEADD fonksiyonunu uygulayarak istenilen Orta Avrupa saat diliminde datetime değerini sağlamasıdır tablonun bir görünüm yaratabilir

cevap

3

.

Yani masa sütunlar şunlardır: id, other_id, evt_time

ardından (görünüm tanımı için) select ifadesi olacaktır:

SELECT id, other_id, evt_time, DATEADD(hh, -2, evt_time) AS evt_time_ce 
    FROM MyTable 

o zaman görünümünü kullanın ve ben genel olarak benzer bir sorun var evt_time_ce sütunda

+0

Bu (bazen bu -2, bazen-3) Gün ışığından ile çalışmaz. – Carra

2

için GROUP_BY geçerlidir, ancak benim Zaman farkı 8 saattir olabilir.

yerel zamanı seçmek için , [Timestamp])dateadd(hour, kullanın ve -8, @dateFrom)dateadd(hour, WHERE maddeleri - hem GROUP BY için çalışması gerekir. Örneğin

:

DECLARE @dateFrom datetime, @dateUntil datetime 
SET @dateFrom = '2011-06-20 00:00:02.000' 
SET @dateUntil = '2011-06-22 10:00:00.000' 

SELECT TOP 100 
    dateadd(hour, 8, [Timestamp]) LocalTime, 
     * 
FROM [Log] L (nolock) 
WHERE L.[Timestamp] BETWEEN dateadd(hour, -8, @dateFrom) AND dateadd(hour, -8, @dateUntil) 
ORDER BY LogID DESC 
+0

LocalTime'ı kullanmak için kullandığınız ofsetde gün ışığından yararlanma saatinin etkisini nasıl karşılarsınız? – vitaminjeff