在where子句日期范围过滤器

时间:2017-02-23 18:01:19

标签: sql-server tsql utc datetimeoffset

使用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子句。

1 个答案:

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

等...

相关问题