8

私のアプリケーションは、世界中のすべての場所の「火曜日」の購入を収集する必要があります。ここで、「火曜日」は場所の火曜日です (タイムゾーンに関係なく)。また、ユーザーが来週レポートを再実行する必要がある場合でも、「先週の火曜日」のデータを取得する必要があります。すべてのデータは DateTimeOffset を使用して保存されます。

したがって、9/4/12 00:00:00 -7 から 9/4/12 23:59:59 -7 は 9/4/12 00:00:00 +11 から 9/4/12 23:59 に一致する必要があります。 WHERE 句を実行すると 59 +11 になります。

WHERE 句で UTC に変換することはできません。これは、場所の火曜日ではなく、ロンドンの「火曜日」のデータを取得するためです (DST によって異なります)。

DateTimeOffset から DateTime に変換してみましたが、UTC に変換されるようです。(私のテストでは、9/1/12 から 9/30/12 を渡すと、8/31/12 のデータが取得されました。)

TSQLでこのようなことをするためのトリックはありますか?

ありがとう!

4

2 に答える 2

2

私見では

DateTimeOffset = DateTime+Offset (UTC から)

したがって、データはすでにクライアントのローカルの日付と時刻を表しています。それを DateTime にキャストするだけで、クライアントのローカルの日付と時刻を取得できます。

ただし、オフセットを日時に追加し、結果の日時が必要な場合は、

DECLARE @PurchaseDate DATETIMEOFFSET(7) = CAST('2007-05-08 12:30:29.1234567 +5:00' AS  datetimeoffset(7)) 

SELECT  CAST(SWITCHOFFSET (@PurchaseDate , '+00:00') AS DATETIME)

詳細については、このブログをご覧ください。

http://blogs.msdn.com/b/bartd/archive/2009/03/31/the-death-of-datetime.aspx

于 2012-09-05T00:51:45.993 に答える
1

DATETIMEOFFSETas をキャストするDATETIMEと、日付と時刻が値のオフセットとして取り、単にタイム ゾーンが削除されます。DATEまたはとしてキャストする場合も同様ですTIMEDATEしたがって、列を単純にキャストして、それを一致させたい日付のみの値と比較できると思います。

DECLARE @targetDate DATETIME2 = '2012-09-04' --Or we could use DATE here
SELECT [PurchaseId], [PurchaseTime], CAST([PurchaseTime] AS DATE) AS "PurchaseDate"
FROM [Purchases]
WHERE CAST([PurchaseTime] AS DATE) = @targetDate

これがどれほど効率的かはわかりませんが (プロバイダーが本当に賢い場合は悪くないことを願っています。SQL Server はおそらくそうなります)、元の列の値を制限することによっても改善される可能性があります。

DECLARE @targetDate DATETIME2 = '2012-09-04' --DATETIME2 so we can adjust by hours
SELECT [PurchaseId], [PurchaseTime], CAST([PurchaseTime] AS DATE) AS "PurchaseDate"
FROM [Purchases]
WHERE CAST([PurchaseTime] AS DATE) = @targetDate --Keep only the local-date matches
    AND [PurchaseTime] >= DATEADD(hh, -14, @targetDate) --Up to 14-hour time zone offset
    AND [PurchaseTime] <= DATEADD(hh, 38, @targetDate) --24 hours later plus 14

これは、一連の可能性に効率的にインデックスを付け、ローカル日付への変換で適切にフィルタリングする必要があります。タイム ゾーンのオフセットは最大 14 時間 (ニュージーランドは +13:00 が最も遠いですが、MSDNによると +/- 14:00 まで可能です) であり、@targetDate はつまり、14 時間前と 24 + 14 = 38 時間後の比較になります。DATETIME2 の範囲と精度は DATETIMEOFFSET と同じであるため、この目的には元の DATETIME よりも適しています (ただし、代わりに DATETIME でも問題なく機能する場合があります)。

于 2013-09-10T20:27:00.890 に答える