DateTimeOffset を Datetime にキャストすると、DateTimeOffset フィールドが UTC に戻るように見えることがあります。
特定の日付の間に発生するすべての注文を検索したいと考えています。OrderDateTime は DateTimeOffset として格納されます。
DECLARE @StartDate DATETIME = '20130723'
,@EndDate DATETIME = '20130724'
SELECT cn.orderdatetime,
LocalTime = CAST(orderdatetime AS datetime),
facilityid
FROM ConsignmentNote cn
WHERE CAST(OrderDateTime AS DATETIME) BETWEEN @StartDate AND @EndDate
このクエリの結果は (ご想像のとおり) です。
OrderDateTime LocalTime Facilityid
2013-07-23 08:26:02.9120644 +10:00 2013-07-23 08:26:02.913 84
2013-07-23 08:27:43.9571506 +10:00 2013-07-23 08:27:43.957 84
2013-07-23 10:24:54.2930893 +10:00 2013-07-23 10:24:54.293 84
ただし、この結果セットを施設 ID でフィルター処理する必要もありますが、施設 ID をクエリに追加すると、次のようになります。
DECLARE @StartDate DATETIME = '20130723'
,@EndDate DATETIME = '20130724'
SELECT cn.orderdatetime,
LocalTime = CAST(orderdatetime AS datetime),
facilityid
FROM ConsignmentNote cn
WHERE CAST(OrderDateTime AS DATETIME) BETWEEN @StartDate AND @EndDate
AND FacilityId = 84
次の結果が得られます
orderdatetime LocalTime facilityid
2013-07-23 10:24:54.2930893 +10:00 2013-07-23 10:24:54.293 84
何が与えますか?クエリに別のパラメーターを追加すると、日付がねじ込まれるのはなぜですか? (nb facilityIDはconsignmentNoteテーブルの int です)
その点を証明するために、StartDate を「20130722」に 1 日戻すと、探している 3 行の結果が得られます。これは、次のことを示しているようです。
CAST (OrderDateTime as DateTime)
(時々?) SELECT または WHERE 句にあるかどうか、または他のパラメーターがあるかどうかに応じて、異なる方法で処理されますか?? (まあ、一律の扱いではないようです)
この問題のトラブルシューティングを行うために、誰かが私をどの方向に向けることができますか? サービス パックまたは修正プログラムである可能性があります
Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64) 2011 年 6 月 17 日 00:54:03 Copyright (c) Microsoft Corporation Enterprise Edition (64 ビット) on Windows NT 6.1 (Build 7601: Service Pack 1)
ところで-これらの値だけを含むテーブルを作成すると、すべて問題なく期待どおりに機能することを知っています(以下のコード)-したがって、環境に配慮する必要があります-はい?
CREATE TABLE #temp (orderdatetime DATETIMEOFFSET,facilityid int)
INSERT INTO #temp VALUES ('2013-07-23 08:26:02.9120644 +10:00',84)
INSERT INTO #temp VALUES ('2013-07-23 08:27:43.9571506 +10:00',84)
INSERT INTO #temp VALUES ('2013-07-23 10:24:54.2930893 +10:00',84)
SELECT orderdatetime,CAST(orderdatetime AS datetime),facilityid
FROM #temp
WHERE CAST(OrderDateTime AS DATETIME) BETWEEN @StartDate AND @EndDate
AND facilityid =84
DROP TABLE #temp