Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Oracle日期算法转换为PostgreSQL_Sql_Oracle_Postgresql_Datetime - Fatal编程技术网

将Oracle日期算法转换为PostgreSQL

将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.

我有一个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]错误:运算符不存在:间隔>整数
提示:找不到具有给定名称和参数类型的运算符。也许您应该添加显式类型转换。职位: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
这是正常的方式吗?