web-dev-qa-db-ja.com

Postgresの間隔で可変期間を使用する

毎月の履歴データを保持する関係があります。このデータは、各月の最終日にテーブルに追加されます。私が書いているサービスは、履歴データを取得する月と数か月前を指定して呼び出すことができます。これを行うには、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の行が正しくないことを知っています。これはどのように適切に行われますか?

42
Belizzle

次の行を使用します。

startDate TIMESTAMP := endDate - ($3 || ' MONTH')::INTERVAL;

MONTHの前のスペースに注意してください。基本的に:4 MONTHのような文字列を作成し、::typeで適切な間隔にキャストします。

編集:別の解決策を見つけました:intervalで次のように計算できます:

startDate TIMESTAMP := endDate - $3 * INTERVAL '1 MONTH';

これは私には少しいいように見えます。

80
A.H.

このコードは状況とは直接関係ありませんが、区間演算で変数を使用する方法を示しています。私のテーブルの名前は「カレンダー」です。

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;