Подсчет рабочих дней между двумя датами Oracle - PullRequest
0 голосов
/ 17 декабря 2018

Я пытаюсь написать запрос, который может подсчитать количество рабочих дней между полученным и обрабатываемым платежом, я начал с этим подыгрывать для платежей, полученных в декабре 2017 года;

select unique trunc(date_received), 
   (case when trunc(date_received) in ('25-DEC-17','26-DEC-17') Then 0 when 
to_char(date_received,'D') <6 Then 1 else 0 end) Working_day
from payments
where date_received between '01-DEC-17' and '31-dec-17'
order by trunc(date_received) 

Но, честно говоря, я в растерянности относительно того, как продвинуться дальше и добавить в date_processed и посчитать количество рабочих дней между date_processed и date_received ... Любая помощь будет принята с благодарностью ...

1 Ответ

0 голосов
/ 17 декабря 2018

Может быть, не самый оптимальный, но он работает довольно хорошо, и легко включать более сложные проверки, такие как праздники.Этот запрос сначала генерирует все даты между двумя датами, а затем позволяет отфильтровать все дни, которые не учитываются.

В этой реализации я отфильтровал только выходные дни, но довольно просто добавить чеки на праздники и тому подобное.

with 
  -- YourQuery: I used a stub, but you can use your actual query here, which 
  -- returns a from date and to date. If you have multiple rows, you can also
  -- output some id here, which can be used for grouping in the last step.
  YourQuery as
  ( 
    select 
      trunc(sysdate - 7) as FromDate,
      trunc(sysdate) as ToDate
    from dual),

  -- DaysBetween. This returns all the dates from the start date up to and
  -- including the end date.
  DaysBetween as
  (  
    select
      FromDate,
      FromDate + level - 1 as DayBetween,
      ToDate
    from
      YourQuery
    connect by
      FromDate + level - 1 <= ToDate)

-- As a last step, you can filter out all the days you want. 
-- This default query only filters out Saturdays and Sundays, but you
-- could add a 'not exists' check that checks against a table with known 
-- holidays.
select
  count(*)
from
  DaysBetween d
where
  trim(to_char(DAYINBETWEEN, 'DAY', 'NLS_DATE_LANGUAGE=AMERICAN'))
    not in ('SATURDAY', 'SUNDAY');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...