将Oracle日期算术转换为PostgreSQL

ip696

我有这个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

D-Shih

如果要进行时间减法,可以使用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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章