我有这个Oracle查询:
Content-Type: application/json
如何为PostgreSQL重写此查询?
我尝试过:
select sm.*
from MESSAGES sm
where sm.delivery_finished = 0
and (sm.last_sent_date is null or (SYSDATE - sm.last_sent_date) * 24 * 60 * 60 > sm.delay)
and sm.status = 'REQUEST_READY'
order by nvl(sm.last_sent_date, to_date('2000.01.01', 'yyyy-MM-dd'))
但是在这一行:
select sm.*
from MESSAGES sm
where sm.delivery_finished = 0
and (sm.last_sent_date is null or (now() - sm.last_sent_date) * 24 * 60 * 60 > sm.delay)
AND sm.status = 'REQUEST_READY'
order by COALESCE(sm.last_sent_date, to_date('2000.01.01', 'yyyy-MM-dd'))
我收到错误消息:
[42883]错误:运算符不存在:时间间隔>整数
提示:找不到具有给定名称和参数类型的运算符。也许您应该添加显式类型转换。位置:148
答案 0 :(得分:3)
如果您想进行时间减法,则可以使用EXTRACT函数。
EXTRACT(SECOND FROM now() - sm.last_sent_date) * 24 * 60 * 60 > sm.delay
我们可以看到now()- '2000.01.01'::timestamp
将返回interval
而不是整数。
所以EXTRACT
函数可以帮助您从时间减法中获取金额
查询1 :
SELECT now()- '2000.01.01'::timestamp,
EXTRACT(SECOND FROM now() - '2000.01.01'::timestamp)
Results :
| ?column? | date_part |
|---------------------------------------------------------|-----------|
| 0 years 0 mons 6852 days 8 hours 47 mins 37.710379 secs | 37.710379 |
答案 1 :(得分:0)
错误提示:
运算符不存在:interval>整数
您必须显式键入两个参数之一。 在PostgreSQL中,您可以使用:: desired_type强制转换列。
我想在您的情况下,您必须在右括号后添加 :: integer