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

日付範囲の月ごとに個別の行を生成する

    CONNECT BY を使用して、単純な行生成手法を使用できます。 構文:

     with sample_data as (select 'XXA' id, to_date('1/23/14','MM/DD/RR') start_date, to_date('3/12/14','MM/DD) /RR') end_date from dual)select id, to_char(add_months(start_date,level - 1),'Month YYYY') date_columnfrom sample_dataconnect by level <=抽出(終了日からの月) - 抽出(開始日からの月) + 1;  

    編集 DISTINCT の追加 これが行全体で機能することを許可する必要があると思いますが、間違っていることが証明されることに興味があります.編集2 複数の年を処理するように変更された例 (本来はそうすべきでした)。 (例 http://sqlfiddle.com/#!4/9eecb/4097/ を参照) 0 .)

     with sample_data as ( select 'XXA' id, to_date('1/23/14','MM/DD/RR') start_date, to_date('3/12/15','MM/DD) /RR') end_date from dual union all select 'XXB' id, to_date('4/12/14','MM/DD/RR') start_date, to_date('6/18/15','MM/DD/ RR') end_date from dual )select distinct id, to_char(add_months(start_date,level - 1),'Month YYYY') date_column, add_months(start_date,level -1) sortkeyfrom sample_dataconnect by level <=ceil(months_between(trunc(end_date) ,'MM'), trunc(start_date,'MM'))) + 1ID順、ソートキー;  

    私のサンドボックス DB では、次の結果が得られます:

    ID DATE_COLUMN SORT_COLXXA 2014 年 1 月 23-JAN-2014 00:00:00XXA 2014 年 2 月 23-FEB-2014 00:00:00XXA 2014 年 3 月 23-MAR-2014 00:00:00XXB 2014 年 4 月 12-APR -2014 00:00:00XXB 2014 年 5 月 12-MAY-2014 00:00:00XXB 2014 年 6 月 12-JUN-2014 00:00:00  

    1. 文字セットを手動で設定した場合に生成されるrakedb:create、一致する照合エラーがあることを確認してください

    2. スキーマ名を持つすべてのストアド プロシージャを一覧表示する

    3. MySQLでツリーをフラット化しますか?

    4. OracleのXMLTABLE-XQueryの動的タイプの不一致:予想されるシングルトンシーケンス-複数項目のシーケンスを取得しました