函数计算两行日期之间的间隔

时间:2012-12-28 13:09:03

标签: sql postgresql timestamp plpgsql postgresql-9.1

我有一个plpgsql块:

EXTRACT(day FROM TIMESTAMP (
         Select evt_start_date
         From events
         Where evt_id = oldEvtId)
      - (Select evt_start_date
         From events
         Where evt_id = newEvtId)
     ) INTO evtStartDateDiff;

如何从上面的查询中找到日期差异,其中startDateendDate作为表格中的参数。

1 个答案:

答案 0 :(得分:1)

看起来像这样( SQL函数):

CREATE OR REPLACE FUNCTION f_days_between(
   old_evt_id int, 
  ,new_evt_id int, 
  ,OUT days_diff int) AS
$func$
SELECT EXTRACT(day FROM evt_start_date
                     - (SELECT e.evt_start_date
                        FROM   events e
                        WHERE  e.evt_id = $2)
              )::int
FROM   events
WHERE  evt_id = $1;
$func$ LANGUAGE sql;

我将其简化并将其放入一个普通的SQL函数中。也可以是 plpgsql函数

CREATE OR REPLACE FUNCTION f_days_between(
   old_evt_id int, 
  ,new_evt_id int, 
  ,OUT days_diff int) AS
$func$
BEGIN
SELECT INTO days_diff
       EXTRACT(day FROM evt_start_date
                     - (SELECT e.evt_start_date
                        FROM   events e
                        WHERE  e.evt_id = old_evt_id)
              )::int
FROM   events
WHERE  evt_id = new_evt_id;
END
$func$ LANGUAGE plpgsql;
  • 对于这个简单的情况,在另一个查询中嵌套一个子查询。

  • 在两种情况下都使用OUT参数来简化语法。这里需要RETURNS条款。有关CREATE FUNCTION in the manual

  • 的更多信息
  • extract()一般会返回double precisioninteger似乎更适合天数,因此转换为整数(::int)并使用整数表示{ {1}}参数。