可能看起来像这样(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 precision
,integer
似乎更适合天数,因此转换为整数 ( ::int
) 并使用整数作为 OUT
参数。