我有一个包含各种记录的 postgresql 数据库,这些记录的日期列看起来像2020-10-12 12:45:55
. 我想构建一个查询,以查找时间戳在任何一天的活动,但在实际时间部分的一天的 22:00:00 和第二天的 05:00:00 之间。
如何忽略日期而只关注此列的时间部分?我想我需要拆分日期列,但仍然可以在剩余的时间字符串上使用<
和运算符。>
我有一个包含各种记录的 postgresql 数据库,这些记录的日期列看起来像2020-10-12 12:45:55
. 我想构建一个查询,以查找时间戳在任何一天的活动,但在实际时间部分的一天的 22:00:00 和第二天的 05:00:00 之间。
如何忽略日期而只关注此列的时间部分?我想我需要拆分日期列,但仍然可以在剩余的时间字符串上使用<
和运算符。>
这不是日期列,而是时间戳(日期和时间)。假设类型
timestamp
,不是timetamptz
吗?(您应该始终披露实际的表定义。)看:
或者:
第一个包括界限,您可以根据需要进行调整。
第二个使用
BETWEEN
,它总是包括边界 - 所以在否定表达式中排除它们。您仍然可以使用 hack 来包含基于内部知识的界限,即 Postgres 在其当前实现中以微秒分辨率(6 个小数位)存储时间和时间戳。
但我强烈反对后者。基于实现细节的构建是脆弱和丑陋的。
将字符串文字向右转换是可选的,因为它们的类型是从类型化列派生的。
事实上,如果我们要与您打交道,则
timestamptz
需要定义世界上应该是 22:00 等的时间。(您可能也需要用 来考虑这timestamp
一点。)请参阅:关于
BETWEEN
并包括下限和上限:如果您经常运行此类查询,请考虑使用表达式索引:
您可以使用强制转换为
time
. 也许这会做:这应该匹配从晚上 10 点开始到第二天早上 5 点之前结束的所有内容。