It’s a bit more complex than it sounds at first. You need to use NEXT_DAY to obtain the nearest earlier date and nearest later date. Then, perform date arithmetic to see how far away each is from the specified date. Finally, compare the “distances” and return the appropriate date. Here is one implementation:
/* Filename on web page: nearday.sf */ CREATE OR REPLACE FUNCTION nearestday ( yourdate IN DATE, dayname IN VARCHAR2) RETURN DATE IS before_date DATE := NEXT_DAY (yourdate-7, dayname); after_date DATE := NEXT_DAY (yourdate, dayname); before_diff NUMBER; after_diff NUMBER; BEGIN before_diff := yourdate - before_date; after_diff := yourdate - after_date; IF before_diff < after_diff THEN RETURN before_date; ELSE RETURN after_date; END IF; END; /
You can take one of two approaches:
Here is a solution following the brute-force method:
/* Filename on web page: bizbetwn2.sf */ CREATE OR REPLACE FUNCTION bizdays_betwn ( ld_date1 DATE, ld_date2 DATE) RETURN NUMBER AS ln_diff NUMBER; ln_bus_days NUMBER; ld_date DATE; ...