sql >> Databáze >  >> RDS >> Oracle

Oracle SQL – získejte počet dní mezi dvěma daty za zadaný měsíc

Únor není měsíc, je to obecný název měsíce v roce. „Měsíc“ ve správném smyslu je únor 2016 nebo únor 2017 atd. Na základě vámi požadovaného výstupu předpokládám, že máte na mysli únor 2016.

Problém je triviální. Ať už definujete měsíc, můžete určit první a poslední den v měsíci. Pokud například zadáte měsíc jako řetězec šesti znaků:input = '201602' , pak můžete použít něco jako

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

a potom vypočítejte počet dní takto:

Příprava (v 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';

Dotaz :

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
;

Výstup :(Poznámka:čísla ve vašem "požadovaném výstupu" jsou nesprávná)

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. Smažte všechny řádky a ponechte poslední x vlevo

  2. Okamžité provedení se nezdaří ani s přidělením tabulky CREATE

  3. Existuje způsob, jak v SQL (MySQL) provést kruhové ORDER BY na konkrétním poli?

  4. pg client.query() nečeká na čekání