2011-06-22 3 views
6

私は立ち往生しています。助けが必要。UTC、TimeZoneを扱い、LocalTimeを使ってGROUP BYを作成する

私はデータベースにUTCの日付を格納します。

例行:

GeneratedAt:

  • 2011-06-08 23:30
  • 2011-06-09 3時30
  • 2011-06-09午前15時30分

私のユーザの現地時間は-2時間(中央ヨーロッパ)です。私が09から行を望むとき、私は3行を持っています。

レポートの目的でGROUP BY日が問題です。私は09のために08と2を1つ持っているが、これは私の現地時間では当てはまらない。

どこでも私は参照してください: "データをUTCに保存"。どのようにこれを正しく行うには?

UPDATE 1:
は、データアクセスのために私はNHibernateはを使用していると私は、データベースエンジンの独立したソリューションを好みます。ですから、私はDate/Time Dimensionテーブル(またはそのようなもの)のようなものでソリューションを探しています。

私のデータテーブルは、このような列があります。

  • GeneratedAt(日時)
  • GeneratedAt_Year(int型)
  • GeneratedAt_Month(int型)
  • GeneratedAt_Day(int型)
  • GeneratedAt_Hour(int型)

私は簡単にgルーピング:年、年+月、年+月+日、年+月+日+時。残念ながら、これはUTCです。 :(ユーザーのタイムゾーンに対応するため、このソリューションをリファクタリングする方法

答えて

3

あなたはDATEADD関数を適用することにより、目的の中央ヨーロッパのタイムゾーンの日時値を提供し、そのテーブルのビューを作成することができます。

あなたのテーブルのカラムがあるのであれば:id, other_id, evt_time

その後、(ビュー定義のための)select文は次のようになります。

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

ビューを使用してevt_time_ceカラムにGROUP_BYを適用する

+0

これは夏時間(それは時々だ-2、時々-3)で動作しません。 – Carra

2

私は一般的に同様の問題がありますが、私の時間差は8時間です。

私は現地時間を選択する , [Timestamp])dateadd(hour,を使用し、-8, @dateFrom)dateadd(hour,でWHERE句 - だけでなく、GROUP BYのために働く必要があります。例えば

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を取得するために使用するオフセットに夏時間の影響をどのように処理しますか? – vitaminjeff

関連する問題