获取具有分钟差异的时间范围内特定日期的数据

Get data in a specific date for a time range with a minute difference

我有以下日期时间范围:

22/07/2021 07:00:52 (start date) 22/07/2021 07:01:00 (end date)

我想要此范围内的所有数据,包括右侧边界。

我的 linq to SQL 查询:

Select * from tableName where CreatedAt >= startDate and CreateAt <= endDate

这里的查询问题是我无法获取 CreatedAt= 22/07/2021 07:01:00(结束日期)的记录。如果我对 endDate 执行 AddMinutes(1),我得到了所需的数据,但我也得到了大于 endDate 的数据。 例如具有以下创建日期

的数据

22/07/2021 07:01:15 22/07/2021 07:01:20

这是错误的。

如何在日期时间的范围比较中包含右边界?

我试过从数据库记录中删除毫秒数:

select *  from Custom_Devices  
where
DATEADD(ms, -DATEPART(ms, CreatedAt), CreatedAt) >= '2019-07-29
19:00:00' 
and 
DATEADD(ms, -DATEPART(ms, CreatedAt), CreatedAt) <= 
'2019-07-29 19:01:00'

附上输出截图:

预期输出:

更新:CreatedAt 列是数据库中的 datetime2 列。

f I do AddMinutes(1) to the endDate

当问题是由额外的毫秒引起并且可以通过增加一秒来解决时,不确定为什么要增加一整分钟..

你真的想在日期上保留毫秒数吗?知道事件发生在 12:34.56.789 而不是 12:34:56 对您有用吗?如果不是,请将该列设置为 datetime2(0) 以永久丢弃毫秒数

否则我推荐其他几个人也在提倡的路线,并像你一样做你的 LINQ

context.Whatever.Where(x => x.CreatedAt >= startDate && x.CreatedAt < endDate.AddSeconds(1))

“小于”很重要。 “小于 12:34:57” 将得到 12:34:56.999999... 这似乎是你想要的“小于或等于 12:34:56”

如果您正在努力理解为什么毫秒会导致问题,请将日期想象成数字 - 如果您有一个数字 1.222222 并且您向数据库询问“小于或等于 1.2”,数据库不会自动- 将 1.222222 舍入到小数点后一位,然后“哦,它等于 1.2”然后 return 它。它只是说“1.222222 不小于或等于 1.2,不要 return 它”

随着时间的推移,对于这样的问题,您总会遇到有人说“只需将其转换为...”或“运行 计算新日期以删除毫秒...”- don 't;如果您编写了一个操作 table 数据的查询,则每次查询数据时都必须执行该操作。它通常也会破坏数据库在列上使用索引的能力(数据库可能会切换到 运行 对索引中的每个值进行操作,每次)这意味着查询需要大量资源.

始终考虑在 where 子句中操作 table 数据作为绝对的最后手段。如果没有其他方法并且查询将被大量使用,请考虑将某种计算列添加到 table 并对其进行索引,以便从概念上讲,您正在执行的操作的结果是一次完成并且可以使用它的索引