Oracle
 sql >> Base de données >  >> RDS >> Oracle

Oracle SQL - obtenir le nombre de jours entre deux dates pour un mois spécifié

Février n'est pas un mois, c'est le nom générique d'un mois dans une année. Un "mois" au sens propre est février 2016, ou février 2017, etc. En fonction de la sortie souhaitée, je suppose que vous voulez dire février 2016.

Le problème est trivial. Quelle que soit la manière dont vous définissez le mois, vous pouvez identifier le premier et le dernier jour du mois. Par exemple, si vous saisissez le mois sous la forme d'une chaîne de six caractères :input = '201602' , alors vous pouvez utiliser quelque chose comme

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

puis calculez le nombre de jours comme ceci :

Préparation (dans 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';

Requête :

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
;

Sortie :(Remarque :les chiffres dans votre "sortie souhaitée" sont incorrects)

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.