获取时间范围内特定日期的数据,时间范围有微小的差异

Posted

技术标签:

【中文标题】获取时间范围内特定日期的数据,时间范围有微小的差异【英文标题】:Get data in a specific date for a time range with a minute difference 【发布时间】:2021-08-11 02:09:51 【问题描述】:

我有以下日期时间范围:

22/07/2021 07:00:52(开始日期) 22/07/2021 07:01:00(结束日期)

我想要这个范围内的所有数据,包括右手边界。

我的 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 列。

【问题讨论】:

如果日期存储毫秒(创建日期时未设置为0),则添加1秒。否则,添加 1 毫秒(到 endDate)。 在这种情况下,CreateAt &lt; endDate(不是&lt;= 看起来数据库中的日期值包含毫秒部分,这就是为什么将其与具有秒精度的数据进行比较以确保相等不会返回 true。您需要将日期与从数据库中删除日期的毫秒数进行比较...***.com/questions/3286849/… @Chetan,尝试删除 ms 但没有成功。 包括所有时间 19:01:00.x 其中 x != 0 然后测试&lt; 19:01:01 【参考方案1】:

f 我对 endDate 执行 AddMinutes(1)

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

您真的想保留日期的毫秒数吗?知道事件发生在 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 位,然后执行“哦,它等于 1.2”并返回。它只是“1.222222不小于或等于1.2,不要返回它”

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

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

【讨论】:

我无法删除日期的毫秒数。可能,继续在 endDate 上增加一秒是更好的方法。 您的 dba 一定会感谢您的! :D 该死!!为什么我没有想到加一秒?可能是因为它们实际上在途中的某个地方被截断了。 :D。但是添加第二个可以解决我的问题。 别担心,这里充满了“很明显我只是错过了”的问题——如果我说它从未发生在我身上,那我就是在撒谎?

以上是关于获取时间范围内特定日期的数据,时间范围有微小的差异的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL 性能优化 - 根据记录更改计算总和和微分

MYSQL搜索条件的微小差异会产生巨大的差异,无法绕过它

在两个范围之间查找

给定日期范围(开始日期和结束日期),我如何计算天数,不包括 .Net 中指定的星期几?

获取日期范围之间每一行的最小和最大日期时间

选择具有不同 where 条件的同一列