使用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子句。
同類奇怪的場景。這是一個僅在俄勒岡州使用的Intranet網絡應用程序。 Web開發人員使用了一些JavaScript datepicker庫,將他的所有日期都改爲UTC,並且他無法弄清楚如何將其更改回來,以便將它們作爲datetimeoffset存儲在數據庫中。所以現在我必須更改所有報告以顯示正確的日期。 '在時區'固定顯示報告中的日期,但它不適用於日期範圍過濾器的where子句。 – BattlFrog
嘗試使用dateadd函數來確定偏移量,而不是依賴「At Time Zone」。我認爲這隻影響顯示,而不是日期的存儲方式。我試圖粘貼一個例子,並有格式化問題。 –