使用dateTimeOffset日期在Where子句范围滤镜中



使用SQL Server2016。这是一个用于报告的SP。当给定的日期范围为02/22/2017时,报告包括2017年2月21日的项目。日期存储在数据库中作为dateTimeOffset。

在此查询中,我正在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应用程序。Web开发人员使用了一些JavaScript DatePicker库,该库将所有日期更改为UTC,他不知道如何更改它们,因此他只是将它们存储在DB中作为DateTimeOffset。因此,现在我必须更改所有报告以显示正确的日期。"在时区"修复了报告中日期的显示,但它在日期范围滤波器的哪个条款中不起作用。

这与您的时区有关吗?您正在将@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))

我在错误的位置的转换上的闭合支架,因此我将@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)

等...

最新更新