我正在使用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}的术语selectedtimeParm
,period
,time frame
和time
的不准确使用因为我在答案中讨论了这个问题。
答案 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
(问题几乎不涉及命令行终端)的事实可能有助于解释为什么没有人回答数日。通常情况下,这里只需几分钟。我很难理解你的问题,不得不多读一遍。
您需要了解数据类型date
,interval
,time
和timestamp
- 包含或不包含时区。首先阅读章节"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