我有一个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;
如何从上面的查询中找到日期差异,其中startDate
和endDate
作为表格中的参数。
答案 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 precision
,integer
似乎更适合天数,因此转换为整数(::int
)并使用整数表示{ {1}}参数。