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

Oracle 再帰クエリ - 日付

    あなたが今持っているものの問題 (余分な cast() は別として) および to_date() 呼び出し) は、4 回目の反復で両方の条件が false であるため、再帰が停止することです。少しスキップして再び拾うようにするものは何もありません。そうしないと、永遠に続きます。再帰内で両方の範囲を達成できるとは思いません。

    必要な最新の日付を再帰部分に入れ、その後必要な 2 つの範囲をフィルター処理できます。

    WITH CTE_Dates (cte_date)  AS (
        SELECT date '2014-01-27'  from dual
        UNION ALL
        SELECT ADD_MONTHS(TRUNC(cte_date, 'MONTH'), 1)
        FROM CTE_Dates
        WHERE ADD_MONTHS(TRUNC(cte_date, 'MONTH'), 1) <= date '2015-01-27'
    )
    SELECT * from CTE_Dates
    WHERE cte_date BETWEEN date '2014-01-27' AND date '2014-04-27'
    OR cte_date BETWEEN date '2014-11-27' AND date '2015-01-27';
    
    CTE_DATE 
    ---------
    27-JAN-14 
    01-FEB-14 
    01-MAR-14 
    01-APR-14 
    01-DEC-14 
    01-JAN-15 
    
     6 rows selected 
      

    ハードコーディングされた値を開始日と終了日のペアに置き換えることができます。範囲が重複する可能性がある場合、または 2 番目の範囲が最初の範囲より前になる (または終了する) 可能性がある場合は、より高い日付を選択できます:

        WHERE ADD_MONTHS(TRUNC(cte_date, 'MONTH'), 1)
          <= greatest(date '2015-01-27', date '2014-04-27')
      

    ... ただし、それは変数でのみ意味があり、固定値では意味がありません。




    1. Oracle SQLを使用して線形補間を実行するにはどうすればよいですか?

    2. mysqlでSQL結合を使用する方法

    3. null行の前の値を取得する

    4. MAMPでMySQLに接続する