sql >> Databasteknik >  >> RDS >> Oracle

Oracle SQL - få antal dagar mellan två datum för en angiven månad

Februari är inte en månad, det är det generiska namnet på en månad på ett år. En "månad" i egentlig mening är februari 2016, eller februari 2017 etc. Baserat på din önskade produktion antar jag att du menar februari 2016.

Problemet är trivialt. Hur du än definierar månaden kan du identifiera den första och sista dagen i månaden. Om du till exempel anger månaden som en sträng med sex tecken:input = '201602' , då kan du använda något liknande

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

och beräkna sedan antalet dagar så här:

Förberedelser (i 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';

Fråga :

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
;

Utdata :(Obs:siffrorna i din "önskade utdata" är felaktiga)

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. Servern svarar inte (eller den lokala MySQL-serverns socket är inte korrekt konfigurerad) i wamp-servern

  2. Kaskadkopiera en rad med alla underordnade rader och deras underordnade rader osv

  3. MySQL 5.7:konvertera enkel JSON_ARRAY till rader

  4. Dynamiskt svänga ett bord Oracle