sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQLの日付の違い

    デバッグ

    関数が実行していることは、多く実行できます。 よりシンプル。構文エラーの実際の原因は次のとおりです:

    SELECT EXTRACT(day FROM TIMESTAMP startDate - endDate) INTO diffDatePart;
    

    startDateをキャストしようとしているようです timestampへ 、パラメータがstartDateであるため、最初は意味がありません。 timestampとして宣言されています すでに。

    また、動作しません。 マニュアルをここに引用します

    このように機能します:

    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
    • 何をしているのかを正確に理解していない限り、大文字と小文字が混在する識別子を使用しないでください。
    • startを減算します 終わりから 正の数を取得するか、絶対値演算子@
    • 日付を引いてから (タイムスタンプを差し引くのとは対照的に 、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$;
    

    同じ電話。



    1. LiferayがMySQLで動作しない

    2. エラー1067(42000):「end_time」のデフォルト値が無効です

    3. SQLSUM関数の使用方法

    4. SQL Server 2014のプロセッサの選択–パート1