Oracle (10g) эквивалент DATEADD (день недели, -3, GETDATE ()) - PullRequest
1 голос
/ 15 апреля 2011

Я ищу Oracle (10g) эквивалент:

DATEADD(weekday, -3, GETDATE())

из T-SQL (SQL Server).Это вычитает 3 рабочих дня из текущей даты.Меня не волнуют праздники или что-то в этом роде (и я могу сократить часть времени от себя).Только исключая выходные, это нормально.

Ответы [ 2 ]

5 голосов
/ 15 апреля 2011

Это можно сделать без функции PL / SQL. Просто вычтите различное количество дней в зависимости от дня недели:

select trunc(sysdate) - case to_char(sysdate, 'D')
                        when '4' then 3 -- thursday minus 3 days
                        when '5' then 3 -- friday minus 3 days
                        when '6' then 4 -- saturday minus 4 days
                        else 5          -- all other days minus 5 days
                        end
from dual;

Когда вы должны сделать это, например, 12 дней назад это выглядело бы как:

select trunc(sysdate) - case to_char(sysdate, 'D')
                        when '1' then 18 -- mondays minus 18 days (incl. 3 weekends)
                        when '2' then 18 -- tuesdays minus 18 days (incl. 3 weekends)
                        when '6' then 17 -- saturdays minus 17 days (incl. 2 weekends and a saturday)
                        else 16          -- all others minus 16 days (incl. 2 weekends)
                        end
from dual;

Обратите внимание, что день недели зависит от NLS_TERRITORY вашей базы данных (в Америке день 1 - воскресенье, в большинстве других день 1 - понедельник).

2 голосов
/ 15 апреля 2011

Похоже, вам нужно создать UDF.

CREATE OR REPLACE FUNCTION business_date (start_date DATE, 
days2add NUMBER) RETURN DATE IS
 Counter NATURAL := 0;
 CurDate DATE := start_date;
 DayNum POSITIVE;
 SkipCntr NATURAL := 0;
 Direction INTEGER := 1;  -- days after start_date
 BusinessDays NUMBER := Days2Add;
BEGIN
  IF Days2Add < 0 THEN
    Direction := - 1; -- days before start_date
    BusinessDays := (-1) * BusinessDays;
  END IF;

  WHILE Counter < BusinessDays LOOP
    CurDate := CurDate + Direction;
    DayNum := TO_CHAR( CurDate, 'D');

    IF DayNum BETWEEN 2 AND 6 THEN
      Counter := Counter + 1;
    ELSE
      SkipCntr := SkipCntr + 1;
    END IF;
  END LOOP;

  RETURN start_date + (Direction * (Counter + SkipCntr));
END business_date;

Предоставлено Ларри Бентоном, от здесь .

...