代码之家  ›  专栏  ›  技术社区  ›  ip696

Oracle日期算法到PostgreSQL的转换

  •  3
  • ip696  · 技术社区  · 7 年前

    我有一个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>整数

    2 回复  |  直到 7 年前
        1
  •  3
  •   D-Shih    7 年前

    如果你想做时间减法,我会用 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 |
    
        2
  •  0
  •   Dilyan Trayanov    7 年前

    正如错误所说:

    运算符不存在:interval>整数

    我想在你的情况下你必须加上 关闭支架后