我有这个Oracle查询:
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]错误:不存在运算符:interval> integer
提示:找不到具有给定名称和参数类型的运算符。也许您应该添加显式类型转换。位置:148
如果要进行时间减法,可以使用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)
结果:
| ?column? | date_part |
|---------------------------------------------------------|-----------|
| 0 years 0 mons 6852 days 8 hours 47 mins 37.710379 secs | 37.710379 |
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句