【发布时间】:2020-04-13 19:42:13
【问题描述】:
我想按日期范围获取数据库记录,包括包含结束日期范围的数据。数据库中的TimeStamp 列是dateTime2(7) 的类型。日期和时间存储在UTC 中。但是,我根据用户时区显示数据。为此,我正在查找时区,然后在C# 中将其转换为BaseUtfOffset。前任。 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 中执行简单的选择语句。返回的数据只包括有开始日期的记录。
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
C# 中产生的DateTimeOffset 的格式会影响结果还是我遗漏了什么?
更新:
存储过程参数:
,@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
【问题讨论】:
-
convert(datetime2(7), timestamp, 1)在这里想要达到什么目的?TimeStamp已经是datetime2,将其转换为一个只会减慢查询速度。 -
@Larnu,我无需进行任何转换即可获得相同的结果。这是我最近一次尝试,看看我是否愿意将日期时间转换为
2020-03-29 19:40:46.8500000 +00:00的样子,也许它可以解决问题,但毫无疑问,不会。 -
如果你想过滤一个日期范围包含,那么你需要在你的上限范围内包括时间。最简单的方法是在日期上加 1 并将过滤器更改为
less than。示例:用户想要在日期 3/18 和 3/29 之间进行过滤。使您的 where 子句大于或等于 2020-3-18 且小于 2020-3-30。此评论没有考虑时区,它严格说明时间在您的 where 子句中很重要,而您目前没有考虑它。 -
关于时区。如果您的日期保留为
datetime2并且日期信息为 UTC,那么您需要将输入参数转换为 UTC,然后按这些参数进行过滤。 -
2020-03-29 19:40:53.1000000+00:00is after2020-03-29T00:00:00-04:00因此convert(datetimeoffset, convert(datetime2(7), timestamp, 1)) <= '3/29/2020 12:00:00 AM -04:00'为假且不显示该行。
标签: c# sql-server-2016 datetimeoffset