使用SQL Server 2016.这是在报告的SP中。给出日期范围02/22/2017,报告包括2017/02/21的项目。日期作为DateTimeOffset存储在数据库中。
在这个查询中,我正在试图在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) )
编辑以添加注释:
这是一种奇怪的情况。这是仅在俄勒冈州使用的Intranet Web应用程序。 Web开发人员使用了一些javascript datepicker库,他将所有日期更改为UTC,他无法弄清楚如何更改它们,所以他只是将它们作为datetimeoffset存储在db中。所以现在我必须更改所有报告以显示正确的日期。 &#39;在时区&#39;修复了报告中日期的显示,但它不适用于日期范围过滤器的where子句。
答案 0 :(得分:0)
我在CONVERT上的右括号位于错误的位置,所以我将@storeddate转换为日期而不是@storedate AT TIME ZONE。所以答案是这样的:
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)
等...