DATETIMEOFFSET
as をキャストするDATETIME
と、日付と時刻が値のオフセットとして取り、単にタイム ゾーンが削除されます。DATE
またはとしてキャストする場合も同様ですTIME
。DATE
したがって、列を単純にキャストして、それを一致させたい日付のみの値と比較できると思います。
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 でも問題なく機能する場合があります)。