我有这个甲骨文查询:
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'))
如何为 PostgreSQL 重写此查询?
我试过这个:
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'))
但是在这一行上:
now() - sm.last_sent_date) * 24 * 60 * 60 > sm.delay
我收到错误:
[42883] 错误:运算符不存在:整数>区间提示
:找不到具有给定名称和参数类型的运算符。也许您应该添加显式类型转换。位置: 148
如果你想做时间减法,我会使用提取函数。
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)
结果:
| ?column? | date_part |
|---------------------------------------------------------|-----------|
| 0 years 0 mons 6852 days 8 hours 47 mins 37.710379 secs | 37.710379 |
正如错误所说:
运算符不存在:间隔>整数
您必须显式类型转换两个参数之一。 在 PostgreSQL 中,您可以使用 ::d esired_type 来转换列。
我想在您的情况下,您必须在右括号后添加 ::integer