Oracle(10g)相当于DATEADD(工作日,-3,GETDATE())

Oracle(10g)相当于DATEADD(工作日,-3,GETDATE()),oracle,oracle10g,date-arithmetic,Oracle,Oracle10g,Date Arithmetic,我正在寻找Oracle(10g)的等效产品: DATEADD(weekday, -3, GETDATE()) 来自T-SQL(SQL Server)。这是从当前日期开始的。我不关心假期或诸如此类的事情(我可以自己缩短时间)。只排除周末是可以的。看起来您需要创建一个UDF CREATE OR REPLACE FUNCTION business_date (start_date DATE, days2add NUMBER) RETURN DATE IS Counter NATURAL := 0

我正在寻找Oracle(10g)的等效产品:

DATEADD(weekday, -3, GETDATE())

来自T-SQL(SQL Server)。这是从当前日期开始的。我不关心假期或诸如此类的事情(我可以自己缩短时间)。只排除周末是可以的。

看起来您需要创建一个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;
创建或替换功能业务日期(开始日期、,
Days2添加编号)返回日期为
反自然:=0;
CurDate日期:=开始日期;
DayNum阳性;
SKIPNCTR自然值:=0;
方向整数:=1;--开始日期后的天
工作日数:=Days2Add;
开始
如果Days2Add<0,则
方向:=-1;--开始日期前天
工作日:=(-1)*工作日;
如果结束;
而计数器

由来自的拉里·本顿提供。

看起来您需要创建一个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;
创建或替换功能业务日期(开始日期、,
Days2添加编号)返回日期为
反自然:=0;
CurDate日期:=开始日期;
DayNum阳性;
SKIPNCTR自然值:=0;
方向整数:=1;--开始日期后的天
工作日数:=Days2Add;
开始
如果Days2Add<0,则
方向:=-1;--开始日期前天
工作日:=(-1)*工作日;
如果结束;
而计数器

由来自的Larry Benton提供。

它可以在没有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_区域(在美国,第一天是星期天,在大多数其他国家,第一天是星期一)。

这可以在没有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_区域(在美国,第1天是星期天,在大多数其他国家,第1天是星期一)。

应该注意的是,这只适用于少数几天(如我的示例中的3天),其中多个周末不是一个因素。您能举个例子吗?我认为我的解决方案可以很容易地调整到任何天数。当天数大于5天时,您必须根据您点击的次数考虑多个周末。@Cade Roux,逻辑不会改变。我在回答中添加了一个例子。应该注意的是,这只适用于少数几天(如我的例子中的3天),其中多个周末不是一个因素。你能举个例子吗?我认为我的解决方案可以很容易地调整到任何天数。当天数大于5天时,您必须根据您点击的次数考虑多个周末。@Cade Roux,逻辑不会改变。我在回答中添加了一个例子。直接等效于
DATEADD(weekday,-3,GETDATE())
的是
从dual
中选择trunc(sysdate)-3。我意识到这已经得到了更详细的回答,但我一直在寻找这个简单的解决方案!直接等价于
DATEADD(weekday,-3,GETDATE())
的是
select trunc(sysdate)-3 from dual
。我意识到这已经得到了更详细的回答,但我一直在寻找这个简单的解决方案!