将 Oracle 日期算术转换为 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'))

如何为 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

最新更新