使用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)
等...