将Oracle日期算法转换为PostgreSQL
我有一个Oracle查询:将Oracle日期算法转换为PostgreSQL,sql,oracle,postgresql,datetime,Sql,Oracle,Postgresql,Datetime,我有一个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.
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 |
:
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中,可以使用::所需的类型强制转换列
我想在你的例子中,你必须在结束括号后加上::integer,是的,这很有帮助!关于nvl的订单(sm.last发送日期,至日期('2000.01.01','yyyy-MM-dd'))?@ip696您可以尝试使用
COALESCE
,COLEASCE的订单中存在键入错误(sm.last发送日期,至日期('2000.01.01','YYYYYY-MM-dd')当前[42883]错误:COLEASCE函数(没有时区的时间戳,日期)不存在。提示:找不到具有给定名称和参数类型的函数。也许您应该添加显式类型转换。职位:231您的COLEASCE
是一个打字错误。。使用COALESCE
而不是COLEASCE
我这样写:按案例排序sm.last\u sent\u date为空,然后是to\u date('2000.01.01','yyyy MM dd'),否则sm.last\u sent\u date END
这是正常的方式吗?