Oracle
 sql >> база данни >  >> RDS >> Oracle

Бройте дните между два сегмента

Ето един начин да направите изчислението - БЕЗ да използвате календарна таблица. Единствените входни данни са това, което идва от първата ви таблица (ID и HIRE_DATE), която включих в клауза WITH (не е част от заявката, която отговаря на въпроса ви!). Всичко останало се изчислява. Показвам как да изчисля броя на дните, ВКЛЮЧИТЕЛНО датата на наемане; ако нямате нужда от това, извадете 1 в края.

TRUNC(<date>, 'iw') е понеделник от седмицата на <date> . Заявката изчислява колко дни има в седмицата на EOM, между понеделник и EOM, но не повече от 5 (в случай че EOM може да е събота или неделя). Прави подобно изчисление за HIRE_DATE, но брои дните от понеделник до HIRE_DATE с изключение HIRE_DATE. Последната част добавя 5 дни за всяка пълна седмица между понеделник на HIRE_DATE и понеделник на EOM.

with
  sample_data(id, hire_date) as (
    select 1, to_date('09/26/2018', 'mm/dd/yyyy') from dual union all
    select 2, to_date('07/10/2018', 'mm/dd/yyyy') from dual
  )
select id, to_char(hire_date, 'Dy mm/dd/yyyy')                      as hire_date,
       to_char(eom, 'Dy mm/dd/yyyy')                                as eom,
       least(5, eom - eom_mon + 1) - least(5, hire_date - hire_mon)
       + (eom_mon - hire_mon) * 5 / 7                               as workdays
from   (
         select id, hire_date, last_day(hire_date) as eom,
                trunc(hire_date, 'iw')             as hire_mon,
                trunc(last_day(hire_date), 'iw')   as eom_mon
         from   sample_data
       )
;

        ID HIRE_DATE               EOM                       WORKDAYS
---------- ----------------------- ----------------------- ----------
         1 Wed 09/26/2018          Sun 09/30/2018                   3
         2 Tue 07/10/2018          Tue 07/31/2018                  16


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. HEXTORAW() Функция в Oracle

  2. Oracle SQL техника за избягване на попълване на транс лог

  3. Извикване на Java функция от Oracle функция

  4. Oracle SQL to_date &to_timestamp ORA-01858:намерен е нецифров знак, където се очаква число &ORA-01850:часът трябва да е между 0 и 23

  5. Oracle Long Raw проблем