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

2つの日付の間隔を月ごとに詳細に分割するにはどうすればよいですか?

    Oracle12cではcross apply 句を使用できます:

    create table e_vents(
     name varchar2(10),
     startdate date,
     enddate date
    );
    
    insert all 
    into e_vents values( 'A', date '2017-12-15', date '2018-01-17' )
    into e_vents values( 'B', date '2017-12-15', date '2017-12-22' )
    into e_vents values( 'C', date '2017-12-15', date '2018-05-22' )
    select null from dual;
    
    commit;
    
    select e.name,
           case when e.startdate > x.s_date then e.startdate else x.s_date end as start_date,
           case when e.enddate < x.e_date then e.enddate else x.e_date end as end_date
    from e_vents e
    cross apply (
      select 
             trunc( e.startdate, 'mm') + (level-1) * interval '1' month as s_date,
             trunc( e.startdate + (level) * interval '1' month, 'mm') -1 as e_date 
      from dual
      connect by level <= months_between( trunc( e.enddate, 'mm'),trunc( e.startdate, 'mm')) + 1
    ) x
    
    NAME       START_DATE END_DATE        
    ---------- ---------- ----------
    A          2017-12-15 2017-12-31
    A          2018-01-01 2018-01-17
    B          2017-12-15 2017-12-22
    C          2017-12-15 2017-12-31
    C          2018-01-01 2018-01-31
    C          2018-02-01 2018-02-28
    C          2018-03-01 2018-03-31
    C          2018-04-01 2018-04-30
    C          2018-05-01 2018-05-22
    
    9 rows selected. 
    


    1. オートコンプリートはすべてのエントリを表示し、検索は行いません

    2. 変更イベントを監査ログテーブルに追加するためのトリガーを作成する方法

    3. 複数文字の区切り文字で文字列の行を短縮するにはどうすればよいですか?

    4. 昨年特定の顧客からの注文総数を取得するためのクエリは、注文が存在しない場合に繰り返される日付を取得します