Проверка определенной даты, если она выпадает на выходные - PullRequest
1 голос
/ 20 марта 2012

Есть ли лучший подход, чем код функции ниже

// checks whether the IN data falls on a weekend 
CREATE OR REPLACE FUNCTION business_days(start_date IN DATE)
   RETURN NUMBER IS
busdays NUMBER := 0;
stDate DATE;

BEGIN

stDate := TRUNC(start_date);

  /* Adjust for ending date on a saturday */
  IF  TO_CHAR(enDate,'D') = '7'    THEN
    busdays := busdays - 1;
  END IF;

  /* Adjust for starting date on a sunday */
  IF TO_CHAR(stDate,'D') = '1' THEN
    busdays := busdays - 1;
  END IF;
else
   busdays := 0;
END IF;

  RETURN(busdays);
END;
/

Ответы [ 2 ]

3 голосов
/ 20 марта 2012

В Oracle дни недели начинаются с понедельника (что соответствует 1); поэтому, если вы хотите узнать, относится ли день к выходным, вам нужно сравнить его с номерами 6 и 7 (в соответствии с субботой и воскресеньем), такими как:

if to_char(prmDate,'D') not in (6,7) then
    --weekend...

Кроме того, извлечение дня (в числовом формате) из даты и сравнение того, является ли это «6» или «7», кажется единственной возможностью понять, является ли это будний день или выходные, и это прекрасно работает.

2 голосов
/ 20 марта 2012

Вы можете сделать это одним запросом:

В соответствии с названием поста вы хотите что-то вроде:

select case when to_char(start_date, 'D') in ('7', '1') then -1 else 0 end
    from dual

В соответствии с вашим примером кода, я думаю, вы хотите:

select case 
         when to_char(start_date, 'D') = '7' and to_char(end_date, 'D') ='1' then -2 
         when to_char(start_date, 'D') = '7' or to_char(end_date, 'D') ='1' then -1 
         else 0 end
from dual
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...