次のようになります ( 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;
この単純なケースでは、1 つのサブクエリを他のクエリ内にネストします。
どちらの場合もパラメーターを使用してOUT
、構文を簡素化します。RETURNS
ここで句の必要性を無効にします。詳細についてCREATE FUNCTION
は、マニュアルを参照してください。
extract()
一般的には を返しますがdouble precision
、integer
日数にはより適切と思われるため、整数 ( ::int
) にキャストし、 OUT
パラメーターに整数を使用します。