在 PostgreSQL 中使用带时间戳的 BETWEEN

Posted

技术标签:

【中文标题】在 PostgreSQL 中使用带时间戳的 BETWEEN【英文标题】:Use of BETWEEN with timestamps in PostgreSQL 【发布时间】:2019-12-10 09:11:04 【问题描述】:

我在 PostgreSQL wiki 中偶然发现了这个页面,建议不要使用 BETWEEN with timestamps:

为什么不呢?

BETWEEN 使用闭区间比较: 结果中包含指定的范围。

这是表单查询的一个特殊问题

SELECT * FROM blah WHERE timestampcol BETWEEN '2018-06-01' AND '2018-06-08'

这将包括时间戳正好是 2018-06-08 的结果 00:00:00.000000,但不是当天晚些时候的时间戳。所以 查询似乎可以工作,但只要你得到一个准确的条目 午夜,你最终会重复计算它。

谁能解释这种“重复计算”是如何发生的?

【问题讨论】:

【参考方案1】:

通常在使用 BETWEEN 时,您希望使用多个范围(在单独的查询中)累积覆盖所有数据。

如果您的查询的下一次调用使用 BETWEEN '2018-06-08' AND '2018-06-015',则 2018-06-08 的确切午夜将包含在两个调用中。另一方面,如果下一个使用 BETWEEN '2018-06-09' AND '2018-06-015',则 2018-06-08 除了确切的午夜之外的所有时间都将被忽略。没有简单的方法(使用 BETWEEN)来构建覆盖每个数据点一次且仅一次的范围。

【讨论】:

关于“不容易的方法...”,timestampcol >= '2018-06-01' AND timestampcol < '2018-06-08' 不会解决问题吗? 是的。这就是这篇文章的重点。我添加了“(使用 BETWEEN)”

以上是关于在 PostgreSQL 中使用带时间戳的 BETWEEN的主要内容,如果未能解决你的问题,请参考以下文章

在 postgresql 中发送数据集

PostgreSQL:为所有行创建具有唯一时间戳的表

将包含 PostgreSQL 时间戳的 QString 转换为 QDateTime

PostgreSQL 中基于时间戳的移动平均线

带有时间戳的 postgreSQL 排序

带时间戳的逻辑删除