选择两个时间戳之间的记录。

41
我正在将一个具有SQL事务命令的Unix脚本转换为PostgreSQL命令。
我有一张表,其中记录具有字段last_update_time(xtime),我想选择在选定的时间段内已更新的表中的每个记录。
比如说,当前时间是05/01/2012 10:00:00,所选时间是04/01/2012 23:55:00。如何从表中选择在这些日期之间已更新的所有记录。我在发出psql命令之前已将2个时间转换为秒,并计算了2个时间段之间的间隔时间(以秒为单位)。
我认为可以这样做:
SELECT A,B,C FROM table
WHERE xtime BETWEEN now() - interval '$selectedtimeParm(in secs)' AND now();

我在评估selectedtimeParmParm时遇到了麻烦——它无法正确解析。

编辑说明:我没有更改错误使用术语periodtime frametimedate来表示timestamp日期时间类型,因为我在我的答案中讨论了这个问题。


1
select * from your_table where tstamp between '2021-04-01' and now(); - Elshan
2个回答

79

这个有效:

SELECT a, b, c
FROM   tbl
WHERE  xtime BETWEEN timestamp '2012-04-01 23:55:00' AND LOCALTIMESTAMP;

LOCALTIMESTAMP 是 SQL 标准中表示 now()::timestamp 的方式。

请注意,标准的 ISO 8601 格式是 YYYY-MM-DD HH24:MI:SS,对于任何区域设置或 DateStyle 设置的时间戳都是无歧义的。

BETWEEN 的第一个值必须是较小的值。如果您不知道期望的值,请改用 BETWEEN SYMMETRIC。 (但这可能会导致查询计划效率降低。)

然而,Postgres 时间戳不是离散值,BETWEEN 包含下限和上限。因此建议 避免使用带有时间戳的 BETWEEN,可以使用以下方法代替:

SELECT a, b, c
FROM   tbl
WHERE  xtime >= timestamp '2012-04-01 23:55:00'
AND    xtime <  LOCALTIMESTAMP;  -- excluding upper bound (optional) 

要使用以秒为单位的间隔计数,只需将基本间隔数量乘以相应的秒数:

...
WHERE  xtime >= LOCALTIMESTAMP - interval '1s' * $selectedtimeParm
AND    xtime <  LOCALTIMESTAMP;

在你的问题中,你将数据类型timestamp称为“日期”,“时间”和“周期”。在标题中,你使用了术语“time frames”(现已更新为“timestamps”)。所有这些术语都是(过去)错误的。自由交换它们也没有帮助。我很难理解。这一点,以及你只标记了 (问题几乎没有关系到命令行终端)可能解释了为什么没有人回答几天。
了解数据类型dateintervaltimetimestamp - 带或不带时区。首先阅读手册中的{{link2:“日期/时间类型”章节}}。
错误消息也会有所帮助。
另外:通常情况下,应该优先选择类型timestamptz而不是timestamp。请参见:

1
我找到了答案:select * from TABLE where record_time BETWEEN $from_datetime AND NOW(); 谢谢。 - Sharon

4

对于任何正在寻找解决方法的人。您需要从where子句中删除时间戳并使用BETWEEN!

TABLENAME.COL-NAME-FOR-TIMESTAMP BETWEEN '2020-01-29 04:18:00-06' AND CURRENT_TIMESTAMP

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接