2017-11-12 9 views
1

DateTimeフィールドが現在の日付の開始時刻と終了時刻の間(UTC + 4)のステートメントを作成しようとしています。別のタイムゾーンで表示レコードを取得する(SQL Server 2008)

私のSQL Serverテーブルには、タイムゾーンUTC + 10(フィールドSENT_TIME)のレコードが含まれています。

タイムゾーンUTC + 4で、00:00:00から23:59:59までの現在の日のすべてのエントリを表示するとします。サーバーのタイムゾーンはUTC + 10です。以下は

は私のSQLクエリですが、間違って動作しているようです:

SELECT SENT_TIME,GETDATE() 
FROM Table 
WHERE (CAST(SENT_TIME AS DATE) = (CAST(DATEADD(hour,- 7, (GETDATE())) AS DATE)) 

それを修正する方法は?

ありがとうございました!

+0

使用しているデータベースの種類 –

+1

このようなタイムゾーンの変換は、DSTやさまざまなソースなどのデータのために間違っている可能性があります。 次のいずれかを実行することをおすすめします。(1)データをUTC(INSERT時間に変換)として使用するか、または(2)datetimeoffsetデータ型を使用して、タイムゾーンでデータを格納します。 –

+0

いくつかのこと:テーブル構造とサンプルデータを提供してください。また、「正しく動作していない」ことを明確にしてください。 – dfundako

答えて

0

あなたはDTSを懸念していないとUTCと純粋に作業した場合、クエリは次のようになります。

-- Time Offset calculation steps (shown for clarity) 
SELECT GETDATE() AS LocalNow, GETUTCDATE() AS UTCNow, 
    DATEADD(HOUR, 4, GETUTCDATE()) AS UTC4Now, DATEADD(HOUR, 10, GETUTCDATE()) AS UTC10Now, 
    DATEADD(day, DATEDIFF(day, 0, DATEADD(HOUR, 4, GETUTCDATE())), 0) AS UTC4DayStart, 
    DATEADD(day, DATEDIFF(day, 0, DATEADD(HOUR, 4, GETUTCDATE())), 1) AS UTC4NextDayStart, 
    DATEADD(HOUR, 6, DATEADD(day, DATEDIFF(day, 0, DATEADD(HOUR, 4, GETUTCDATE())), 0)) AS UTC4DayStartInUTC10, 
    DATEADD(HOUR, 6, DATEADD(day, DATEDIFF(day, 0, DATEADD(HOUR, 4, GETUTCDATE())), 1)) AS UTC4NextDayStartInUTC10 

-- Your query should become this 
SELECT SENT_TIME, DATEADD(HOUR, -6, SENT_TIME) AS SENT_TIME_UTC4 
FROM Table 
WHERE DATEADD(HOUR, 6, DATEADD(day, DATEDIFF(day, 0, DATEADD(HOUR, 4, GETUTCDATE())), 0)) <= SENT_TIME 
    AND SENT_TIME < DATEADD(HOUR, 6, DATEADD(day, DATEDIFF(day, 0, DATEADD(HOUR, 4, GETUTCDATE())), 1)) 

注:GETDATE()返しDTS調整された時間。

関連する問題