2017-02-23 115 views
-1

使用SQL Server 2016.它位於報表的SP中。當給定2017年2月22日的日期範圍時,報告包括2017年2月21日的項目。日期作爲DateTimeOffset存儲在數據庫中。在where子句的日期範圍過濾器中使用datetimeoffset日期

在這個查詢我amtrying回到22日,但我也得到第21。

@start和@end代表用戶輸入的日期範圍。 @storeddate是用於過濾報表的數據庫的日期。我的計劃是轉換偏移日期,然後拉出'日期'部分過濾,但它不工作。

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)) 

編輯加註:

同類奇怪的場景。這是一個僅在俄勒岡州使用的Intranet網絡應用程序。 Web開發人員使用了一些JavaScript datepicker庫,將他的所有日期都改爲UTC,並且他無法弄清楚如何將其更改回來,以便將它們作爲datetimeoffset存儲在數據庫中。所以現在我必須更改所有報告以顯示正確的日期。 '在時區'固定顯示報告中的日期,但它不適用於日期範圍過濾器的where子句。

回答

0

我對放錯了地方的CONVERT右括號,所以我的@storeddate轉換爲日期,而不是@storedate在時間區。因此,答案是這樣的:

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

同類奇怪的場景。這是一個僅在俄勒岡州使用的Intranet網絡應用程序。 Web開發人員使用了一些JavaScript datepicker庫,將他的所有日期都改爲UTC,並且他無法弄清楚如何將其更改回來,以便將它們作爲datetimeoffset存儲在數據庫中。所以現在我必須更改所有報告以顯示正確的日期。 '在時區'固定顯示報告中的日期,但它不適用於日期範圍過濾器的where子句。 – BattlFrog

+0

嘗試使用dateadd函數來確定偏移量,而不是依賴「At Time Zone」。我認爲這隻影響顯示,而不是日期的存儲方式。我試圖粘貼一個例子,並有格式化問題。 –