Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Oracle SQL - uzyskaj liczbę dni między dwiema datami dla określonego miesiąca

Luty to nie miesiąc, to ogólna nazwa miesiąca w roku. „Miesiąc” we właściwym znaczeniu to luty 2016 lub luty 2017 itd. W oparciu o pożądane wyniki zakładam, że masz na myśli luty 2016.

Problem jest banalny. Jakkolwiek zdefiniujesz miesiąc, możesz określić pierwszy i ostatni dzień miesiąca. Na przykład, jeśli wprowadzisz miesiąc jako sześcioznakowy ciąg:input = '201602' , możesz użyć czegoś takiego jak

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

a następnie oblicz liczbę dni w ten sposób:

Przygotowanie (w 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';

Zapytanie :

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
;

Wyjście :(Uwaga:liczby w "pożądanym wyniku" są nieprawidłowe)

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dowiedz się, jakiego symbolu waluty używa Twoja sesja w Oracle

  2. Implementacja funkcji Listagg Overflow (Oracle SQL)

  3. Przejdź przez wszystkie schematy w Talend

  4. Preferowane długości kolumn Oracle

  5. znak do tej pory w Oracle sql