sql >> Database teknologi >  >> RDS >> Oracle

Oracle SQL - få antal dage mellem to datoer for en bestemt måned

Februar er ikke en måned, det er det generiske navn på en måned på et år. En "måned" i egentlig forstand er februar 2016 eller februar 2017 osv. Baseret på dit ønskede output, antager jeg, at du mener februar 2016.

Problemet er trivielt. Uanset hvordan du definerer måneden, kan du identificere den første og den sidste dag i måneden. For eksempel, hvis du indtaster måneden som en streng på seks tegn:input = '201602' , så kan du bruge noget som

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

og udregn derefter antallet af dage som dette:

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

Forespørgsel :

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
;

Output :(Bemærk:tallene i dit "ønskede output" er forkerte)

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. MySQL Database backup automatisk på en Windows-server

  2. I applikationen har jeg adgang til JDBC-driver (undtagelse java.lang.ClassNotFoundException:com.mysql.cj.jdbc.Driver)

  3. Hvordan kombinerer jeg disse 3 forespørgsler til én MySQL-forespørgsel?

  4. Oracle:'=ANY()' vs. 'IN ()'