0

我有一个 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作为表中的参数。

4

1 回答 1

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手册

  • extract()通常返回double precisioninteger似乎更适合天数,因此转换为整数 ( ::int) 并使用整数作为 OUT参数。

于 2013-02-10T09:17:50.097 回答