0

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;

テーブルからパラメータとして取得する上記のクエリから、日付の差を日数で見つけるにはどうすればよいですか。startDateendDate

4

1 に答える 1

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;
  • この単純なケースでは、1 つのサブクエリを他のクエリ内にネストします。

  • どちらの場合もパラメーターを使用してOUT、構文を簡素化します。RETURNSここで句の必要性を無効にします。詳細についてCREATE FUNCTIONは、マニュアルを参照してください。

  • extract()一般的には を返しますがdouble precisioninteger日数にはより適切と思われるため、整数 ( ::int) にキャストし、 OUTパラメーターに整数を使用します。

于 2013-02-10T09:17:50.097 に答える