我试图在PL SQL中获得上一个工作日。我不确定100%的尝试方法是否正确。
基本上,我们有一个假期表,我正试图在假期表中循环输入日期,然后返回上一个工作日。我使用游标获取假期清单,然后使用while
循环。我的问题是代码可以运行,但是光标仅返回假日列表中的最后一个值。
Create or Replace Function GetPreviousWorkingDay
(
CurrentDate in Date
)
Return Date
As
PreviousWorkingDay Date;
Cursor dt_cursor is
Select holiday_date
from holiday_table;
HolidayDate date;
Begin
PreviousWorkingDay := CurrentDate;
Open dt_cursor;
Loop
Fetch dt_cursor into HolidayDate;
Exit When dt_cursor%NOTFOUND;
End Loop;
While PreviousWorkingDay = HolidayDate
Loop
PreviousWorkingDay := PreviousWorkingDay - 1;
Exit When PreviousWorkingDay <> HolidayDate;
End Loop;
Close dt_cursor;
Return previousworkingday;
END;
任何帮助将不胜感激。谢谢
答案 0 :(得分:3)
只有在查询中指定holiday_table
时,使用CURSOR
循环遍历ORDER BY
的逻辑才会起作用。
CREATE OR REPLACE FUNCTION getpreviousworkingday (
currentdate IN DATE
) RETURN DATE AS
previousworkingday DATE := currentdate - 1; -- start from previous day
l_holiday DATE;
CURSOR dt_cursor IS SELECT holiday_date
FROM holiday_table
WHERE holiday_date < currentdate
ORDER BY holiday_table DESC;--start with recent holiday before
--currentdate & keep compare backwards.
BEGIN
OPEN dt_cursor;
LOOP
FETCH dt_cursor INTO l_holiday;
EXIT WHEN dt_cursor%notfound OR previousworkingday <> l_holiday;
previousworkingday := previousworkingday - 1;
END LOOP;
RETURN previousworkingday;
END;
/
注意:我们可以使用SQL查询轻松获得上一个工作日,而无需PL / SQL。您可以参考答案 here 。我使用循环和游标回答了这个问题,因为我想您可能出于学习的目的在PL / SQL中使用了这些构造。