2

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 facilityIDconsignmentNoteテーブルの 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
4

2 に答える 2

1

この男は、あなたが見つけたものとは逆のことをしようとしていました. つまり、彼は日時オフセットを UTC に変換しようとしていました。しかし、このタイプのキャスティングについてはいくつかの議論があり、関連性があると思います。

以下のテストでは:

DECLARE @Something datetimeoffset(7)

SET @Something = '2008-12-19 17:30:09.1234567 +11:00'

SELECT 1
WHERE DATEPART(hour, convert(datetime, @Something)) = 17

select cast(@Something as datetime)
select convert(datetime, @Something, 109)

CONVERT は WHERE 句のタイムゾーンを UTC に変更せず、SELECT 句のタイムゾーンも変更しないようです。ただし、変換でスタイルを使用すると、UTC に変更されます。

お役に立てれば。

于 2013-07-23T03:52:58.240 に答える