Oracle(10g)に相当するものを探しています:
DATEADD(weekday, -3, GETDATE())
T-SQL(SQL Server)から。これにより、現在の日付から3平日が差し引かれます。私は休日やそのようなことについては心配していません(そして私は自分で時間の部分を切り捨てることができます)。週末を除いて大丈夫です。
Oracle(10g)に相当するものを探しています:
DATEADD(weekday, -3, GETDATE())
T-SQL(SQL Server)から。これにより、現在の日付から3平日が差し引かれます。私は休日やそのようなことについては心配していません(そして私は自分で時間の部分を切り捨てることができます)。週末を除いて大丈夫です。
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日目は日曜日、他のほとんどの日は月曜日です)。
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;
ここから、ラリーベントンの礼儀。