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

时间:2012-01-04 07:39:20

标签: postgresql datetime

我正在使用SQL transact命令将Unix脚本转换为PostgreSQL命令。

我有一个包含字段last_update_time(xtime)的记录的表,我想选择表中已在选定时间段内更新的每条记录。

说,当前时间05/01/2012 10:00:00和所选时间为04/01/2012 23:55:00。如何从表中选择在这些日期之间更新的所有记录。在发出psql命令之前,我已经在Unix脚本中将2次转换为秒,并计算了2个时间段之间的间隔(以秒为单位)。

我想像

SELECT A,B,C FROM table
WHERE xtime BETWEEN now() - interval '$selectedtimeParm(in secs)' AND now();

我无法评估Parm的{​​{1}} - 它无法正确解析。

编者注:我没有更改日期时间类型{{1}的术语selectedtimeParmperiodtime frametime的不准确使用因为我在答案中讨论了这个问题。

2 个答案:

答案 0 :(得分:34)

出了什么问题:

SELECT a,b,c
FROM   table
WHERE  xtime BETWEEN '2012-04-01 23:55:00'::timestamp
                 AND now()::timestamp;

如果您希望使用秒数作为interval 进行操作:

...
WHERE  xtime BETWEEN now()::timestamp - (interval '1s') * $selectedtimeParm
                 AND now()::timestamp;

请注意,我如何使用标准ISO 8601日期格式YYYY-MM-DD h24:mi:ss,该格式与任何区域设置或DateStyle设置无关。

另请注意,BETWEEN构造的第一个值必须是较小的值。如果您不知道哪个值较小,请改用BETWEEN SYMMETRIC

在您的问题中,您将日期时间类型timestamp称为“日期”,“时间”和“期间”。在标题中,您使用术语“时间帧”,我将其更改为“时间戳”。所有这些术语都是错误的。自由地交换它们使得这个问题更难理解。

那,以及您只标记问题psql(问题几乎不涉及命令行终端)的事实可能有助于解释为什么没有人回答数日。通常情况下,这里只需几分钟。我很难理解你的问题,不得不多读一遍。

您需要了解数据类型dateintervaltimetimestamp - 包含或不包含时区。首先阅读章节"Date/Time Types" in the manual

错误信息也会有很长的路要走。

答案 1 :(得分:1)

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

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