Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Oracle SQL - Abrufen der Anzahl der Tage zwischen zwei Daten für einen bestimmten Monat

Februar ist kein Monat, sondern der allgemeine Name eines Monats in einem Jahr. Ein "Monat" im eigentlichen Sinne ist Februar 2016, oder Februar 2017 usw. Aufgrund Ihrer gewünschten Ausgabe nehme ich an, dass Sie Februar 2016 meinen.

Das Problem ist trivial. Wie auch immer Sie den Monat definieren, Sie können den ersten und den letzten Tag des Monats identifizieren. Wenn Sie beispielsweise den Monat als sechsstellige Zeichenfolge eingeben:input = '201602' , dann können Sie so etwas wie

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

und berechnen Sie dann die Anzahl der Tage wie folgt:

Vorbereitung (in 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';

Abfrage :

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
;

Ausgabe :(Hinweis:Die Zahlen in Ihrer "gewünschten Ausgabe" sind falsch)

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.