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

OracleSQL-指定された月の2つの日付間の日数を取得します

    2月は月ではなく、1年の月の総称です。正しい意味での「月」は、2016年2月、2017年2月などです。希望する出力に基づいて、2016年2月を意味すると思います。

    問題は些細なことです。月をどのように定義しても、その月の最初と最後の日を識別できます。たとえば、月を6文字の文字列として入力した場合:input = '201602' 、次に次のようなものを使用できます

    to_date(input, 'yyyymm')                as month_start, 
    last_day(to_date(input, 'yyyymm'))      as month_end
    

    次に、次のように日数を計算します。

    準備 (SQLPlusの場合):

    SQL> variable input varchar2(30)
    SQL> exec :input := '201602';
    
    PL/SQL procedure successfully completed.
    
    SQL> alter session set nls_date_format = 'dd/mm/yyyy';
    

    クエリ

    with
         test_dates ( datefrom, dateto ) as (
           select to_date('28/1/2016', 'dd/mm/yyyy'), to_date('15/2/2016', 'dd/mm/yyyy') from dual union all
           select to_date('10/2/2016', 'dd/mm/yyyy'), to_date('3/3/2016' , 'dd/mm/yyyy') from dual union all
           select to_date('5/2/2016' , 'dd/mm/yyyy'), to_date('16/2/2016', 'dd/mm/yyyy') from dual union all
           select to_date('20/1/2016', 'dd/mm/yyyy'), to_date('10/3/2016', 'dd/mm/yyyy') from dual
         )
    --  end of test data; solution (SQL query) begins below this line
    select t.datefrom, t.dateto, to_char(to_date(:input, 'yyyymm'), 'MON yyyy') as month,
           case when t.datefrom > m.month_end or t.dateto < m.month_start then 0
                else least(t.dateto, m.month_end) - greatest(t.datefrom, m.month_start) + 1
                end as number_of_days
    from   test_dates t cross join 
                      ( select to_date(:input, 'yyyymm') as month_start,
                               last_day(to_date(:input, 'yyyymm')) as month_end 
                        from   dual) m
    ;
    

    出力 :(注:「目的の出力」の数値は正しくありません)

    DATEFROM   DATETO     MONTH    NUMBER_OF_DAYS
    ---------- ---------- -------- --------------
    28/01/2016 15/02/2016 FEB 2016             15
    10/02/2016 03/03/2016 FEB 2016             20
    05/02/2016 16/02/2016 FEB 2016             12
    20/01/2016 10/03/2016 FEB 2016             29
    
    4 rows selected.
    


    1. ROracle でのエンコーディング

    2. Postgresql、json配列から特定のキーの値を取得します

    3. mysqldumpを取得して、psql入力に適したデータをダンプします(エスケープされた一重引用符)

    4. 改行を保持したままMySQLにテキストデータを保存および取得するにはどうすればよいですか?