2017-02-23 24 views
-1

SQL Server 2016を使用しています。これはレポート用のSPです。 2021年2月22日の日付範囲を指定すると、レポートには2011年2月21日のアイテムが含まれます。日付は、DateTimeOffsetとしてdbに格納されます。where句の日付範囲フィルタの日付範囲フィルタの使用

このクエリでは、私は22日に帰りたいと思っていますが、21番も取得しています。

@startと@endは、ユーザーが入力した日付範囲を表します。 @storeddateは、レポートのフィルタリングに使用されたdbからの日付です。私の計画は、オフセット日付を変換し、 '日付'の部分をフィルタリングするために取り出していますが、動作していません。

declare @start date = '2017-02-22'; 
declare @end date = '2017-02-22'; 
declare @storeddate datetimeoffset = '2017-02-22 00:00:19.0000000 +00:00'; 


;with dates as 
(
    select @storeddate as 'raw' 
     , @storeddate AT TIME ZONE 'Pacific Standard Time' as offset 
     , CONVERT(datetime, @storeddate) AT TIME ZONE 'Pacific Standard Time' as dt 
     , CONVERT(datetime, @storeddate AT TIME ZONE 'Pacific Standard Time') as d 
     , CAST(CONVERT(datetime, @storeddate) AT TIME ZONE 'Pacific Standard Time' as date) as 'casted' 
     , @start as 'start' 
     , @end as 'end' 

) 

select * from dates 
WHERE (
    CAST(CONVERT(datetime, @storeddate) AT TIME ZONE 'Pacific Standard Time' as date) >= @start 
    AND CAST(CONVERT(datetime, @storeddate) AT TIME ZONE 'Pacific Standard Time' as date) < DATEADD(day, 1, @end)) 

編集メモを追加するには:奇妙なシナリオの

そのようなもの。これは、オレゴン州でのみ使用されるイントラネットWebアプリケーションです。 Web開発者は、すべての日付をUTCに変更したjavascriptのdatepickerライブラリを使用していました。それらを元に戻す方法を理解できず、datetimeoffsetとしてdbに保存しました。だから今、私は正しい日付を表示するためにすべてのレポートを変更する必要があります。 'At Time Zone'はレポートの日付の表示を修正しましたが、日付範囲フィルタのwhere句では機能しません。

答えて

0

私は間違った場所にCONVERTに閉じ括弧を持っていたので、私は一度に代わり@storedateの日付に@storeddateに変換されましたゾーン。

WHERE CAST(CONVERT(datetime, @storeddate AT TIME ZONE 'Pacific Standard Time') as date) 

代わりの

WHERE CAST(CONVERT(datetime, @storeddate) AT TIME ZONE 'Pacific Standard Time' as date) 

等...

0

これはあなたのタイムゾーンと関係がありますか?オフセットなしで@storeddateを入れて、太平洋時間(-8:00、それではないですか?)を評価しているようです。それは返されたデータをシフトするようです。

編集:日付を修正するためにDATEADD使用してみてください:

declare @start date = '2017-02-22'; 
declare @end date = '2017-02-22'; 
declare @storeddate table (rawdate datetimeoffset) 
insert into @storeddate 
values('2017-02-22 00:00:19.0000000 +00:00') 
,('2017-02-21 00:00:19.0000000 +00:00') 
,('2017-02-22 00:18:19.0000000 +00:00') 
,('2017-02-23 00:18:19.0000000 +00:00') 

;with dates as 
(
    select rawdate as 'raw' 
     , cast(dateadd(hh,-8,rawdate) as date) as offset 
     , @start as 'start' 
     , @end as 'end' 
     from @storeddate 
) 

select * from dates 
WHERE (
    offset >= @start 
and offset < DATEADD(day, 1, @end)) 
+0

奇数シナリオのその種:だから答えはこれでした。これは、オレゴン州でのみ使用されるイントラネットWebアプリケーションです。 Web開発者は、すべての日付をUTCに変更したjavascriptのdatepickerライブラリを使用していました。それらを元に戻す方法を理解できず、datetimeoffsetとしてdbに保存しました。だから今、私は正しい日付を表示するためにすべてのレポートを変更する必要があります。 'At Time Zone'はレポートの日付の表示を修正しましたが、日付範囲フィルタのwhere句では機能しません。 – BattlFrog

+0

'At Time Zone'に頼るのではなく、dateadd関数を使用してオフセットを調べてみてください。私は、日付が格納される方法ではなく、表示にのみ影響を与えると思います。私は例を貼り付けようとしており、フォーマット上の問題がある。 –