我想按日期范围获取数据库记录,该日期范围包括包含结束日期范围的数据。数据库中的TimeStamp
列是dateTime2(7)
的类型。日期和时间存储在UTC
中。但是,我正在根据用户时区显示数据。为此,我要查找时区,然后将其转换为BaseUtfOffset
中的C#
。例如3/18/2020
和3/29/2020
var newOffSetDate = TimeZoneInfo.FindSystemTimeZoneById(timeZoneName);
DateTimeOffset d1 = new DateTimeOffset(Convert.ToDateTime(date1), newOffSetDate.BaseUtcOffset);
DateTimeOffset d2 = new DateTimeOffset(Convert.ToDateTime(date2), newOffSetDate.BaseUtcOffset);
然后,我在此处创建的过程(DateTimeOffset
参数的类型)中传递开始和结束日期,以在SQL中执行简单的select语句。返回的数据仅包括带有开始日期的记录。
create table MyTable
(
Id int Primary Key Identity(1,1),
[TimeStamp] datetime2(7) not null
)
insert into MyTable(TimeStamp) values('2020-03-29 19:40:46.8500000')
insert into MyTable(TimeStamp) values('2020-03-29 19:40:53.1000000')
insert into MyTable(TimeStamp) values('2020-03-18 17:15:48.2600000')
select * from MyTable
where
convert(datetimeoffset, convert(datetime2(7), timestamp, 1)) >= '3/18/2020 12:00:00 AM -04:00' and
convert(datetimeoffset, convert(datetime2(7), timestamp, 1)) <= '3/29/2020 12:00:00 AM -04:00'
例如,在上述情况下,我应该获得所有记录,但是我仅获得一条记录。
2020-03-18 17:15:48.2600000
DateTimeOffset
中产生的C#
格式是否会影响结果?还是我遗漏了某些东西?
更新:
存储过程参数:
,@StartDate DateTimeOffset = NULL
,@EndDate DateTimeOffset = NULL
在示例中使用:开始日期3/18/2019
和结束日期3/29/2020
。将日期转换为DateTimeOffset的C#方法产生以下输出:
d1 = 3/18/2020 12:00:00 AM -04:00
d2 = 3/29/2020 12:00:00 AM -04:00
您的查询返回行的原因是因为这是正确的。您有3次,您说的是UTC:
2020-03-29 19:40:46.8500000+00:00
2020-03-29 19:40:53.1000000+00:00
2020-03-18 17:15:48.2600000+00:00
因此将它们转换为-04:00
(EDT):
2020-03-29 15:40:46.8500000-04:00
2020-03-29 15:40:53.1000000-04:00
2020-03-18 13:15:48.2600000-04:00
然后您要查看时间是在 both2020-03-18T00:00:00-04:00
还是之后和2020-03-29T00:00:00-04:00
还是在[[before]之前。2020-03-18 13:15:48.2600000-04:00
既在2020-03-18T00:00:00-04:00
之后又在2020-03-29T00:00:00-04:00
之前,因此显示。另一方面,2020-03-29 15:40:53.1000000-04:00
和2020-03-29 15:40:46.8500000-04:00
是after 2020-03-29T00:00:00-04:00
,因此不显示。 您将获得1行,因为其中只有1行满足WHERE
。