将Oracle日期算术转换为PostgreSQL

时间:2018-10-05 08:28:13

标签: sql oracle postgresql datetime

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

2 个答案:

答案 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