デバッグ
関数が実行していることは、はるかに簡単に実行できます。構文エラーの実際の原因は次のとおりです。
SELECT EXTRACT(day FROM TIMESTAMP startDate - endDate) INTO diffDatePart;
パラメータがすでに宣言されているため、にキャストしよstartDate
うとしているように見えますが、最初は意味がありません。timestamp
startDate
timestamp
また、動作しません。ここでマニュアルを引用します:
構文のあいまいさを回避するために、タイプ'string'構文は、単純なリテラル定数のタイプを指定するためにのみ使用できます。
これは次のように機能します。
SELECT EXTRACT(day FROM startDate - endDate)::int INTO diffDatePart;
しかし、それでもあまり意味がありません。あなたは「日付」について話しているが、それでもパラメータを。として定義しているtimestamp
。あなたはこのようにあなたが持っているものを消毒することができます:
CREATE OR REPLACE FUNCTION f_date_diff()
RETURNS int AS
$BODY$
DECLARE
start_date date;
end_date date;
date_diff int;
BEGIN
SELECT evt_start_date FROM events WHERE evt_id = 5 INTO start_date;
SELECT evt_start_date FROM events WHERE evt_id = 6 INTO end_date;
date_diff := (endDate - startDate);
RETURN date_diff;
END
$BODY$ LANGUAGE plpgsql;
DECLARE
一度だけ必要です。
date
適切なタイプとして宣言された列date
。
- 何をしているのかを正確に理解していない限り、大文字と小文字が混在する識別子を使用しないでください。
- 開始を終了から減算して正の数を取得するか、絶対値演算子を
@
適用します。
日付を減算すると(タイムスタンプを減算するとinterval
)はすでに生成integer
されるため、次のように単純化します。
SELECT (startDate - endDate) INTO diffDatePart;
または、plpgsqlの割り当てとしてさらに簡単です。
diffDatePart := (startDate - endDate);
簡単なクエリ
サブクエリを使用して、単純なクエリで単純なタスクを解決できます。
SELECT (SELECT evt_start_date
FROM events
WHERE evt_id = 6)
- evt_start_date AS date_diff
FROM events
WHERE evt_id = 5;
または、ベーステーブルをそれ自体に接続することもできますCROSS JOIN
(各インスタンスから1行なので、問題ありません)。
SELECT e.evt_start_date - s.evt_start_date AS date_diff
FROM events e
,events s
WHERE e.evt_id = 6
AND s.evt_id = 5;
SQL関数
目的のために関数を主張する場合は、単純なSQL関数を使用してください。
CREATE OR REPLACE FUNCTION f_date_diff(_start_id int, _end_id int)
RETURNS int LANGUAGE sql AS
$func$
SELECT e.evt_start_date - s.evt_start_date
FROM events s, events e
WHERE s.evt_id = $1
AND e.evt_id = $2
$func$;
電話:
SELECT f_date_diff(5, 6);
PL/pgSQL関数
plpgsqlを主張する場合..。
CREATE OR REPLACE FUNCTION f_date_diff(_start_id int, _end_id int)
RETURNS int LANGUAGE plpgsql AS
$func$
BEGIN
RETURN (SELECT evt_start_date
- (SELECT evt_start_date FROM events WHERE evt_id = _start_id)
FROM events WHERE evt_id = _end_id);
END
$func$;
同じ呼び出し。