毎月の履歴データを保持する関係があります。このデータは、各月の最終日にテーブルに追加されます。私が書いているサービスは、履歴データを取得する月と数か月前を指定して呼び出すことができます。これを行うには、startDate変数とendDate変数を作成し、2つの間でデータを返します。私が抱えている問題は、startDateがendDateの前の可変月数であり、間隔で可変期間を使用する方法を理解できないことです。
ここに私が持っているものがあります:
DECLARE
endDate TIMESTAMP := (DATE_TRUNC('MONTH',$2) + INTERVAL '1 MONTH') - INTERVAL '1 DAY';
startDate TIMESTAMP := endDate - INTERVAL $3 'MONTH';
StartDateの行が正しくないことを知っています。これはどのように適切に行われますか?
次の行を使用します。
startDate TIMESTAMP := endDate - ($3 || ' MONTH')::INTERVAL;
MONTH
の前のスペースに注意してください。基本的に:4 MONTH
のような文字列を作成し、::type
で適切な間隔にキャストします。
編集:別の解決策を見つけました:interval
で次のように計算できます:
startDate TIMESTAMP := endDate - $3 * INTERVAL '1 MONTH';
これは私には少しいいように見えます。
このコードは状況とは直接関係ありませんが、区間演算で変数を使用する方法を示しています。私のテーブルの名前は「カレンダー」です。
CREATE OR REPLACE FUNCTION test_param(num_months integer)
RETURNS SETOF calendar AS
$BODY$
select * from calendar
where cal_date <= '2008-12-31 00:00:00'
and cal_date > date '2008-12-31' - ($1 || ' month')::interval;
$BODY$
LANGUAGE sql VOLATILE
COST 100
ROWS 1000;