sql >> Database >  >> RDS >> Oracle

Oracle SQL - verkrijg het aantal dagen tussen twee datums voor een bepaalde maand

Februari is geen maand, het is de generieke naam van een maand in een jaar. Een "maand" in de juiste zin is februari 2016, of februari 2017 enz. Op basis van uw gewenste output, neem ik aan dat u februari 2016 bedoelt.

Het probleem is triviaal. Hoe u de maand ook definieert, u kunt de eerste en de laatste dag van de maand identificeren. Als u bijvoorbeeld de maand invoert als een tekenreeks van zes tekens:input = '201602' , dan kun je zoiets gebruiken als

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

en bereken dan het aantal dagen als volgt:

Voorbereiding (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';

Zoekopdracht :

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
;

Uitvoer :(Opmerking:de cijfers in uw "gewenste uitvoer" zijn onjuist)

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. Hoe gegevens op te slaan in MySql met cygnus?

  2. bestellen op newid() - hoe werkt het?

  3. Sqlite wijzigen in PostgreSQL in ruby ​​on rails

  4. Een tijdelijke oplossing voor DATEDIFF() SET DATEFIRST negeren in SQL Server (T-SQL-voorbeeld)