PL/SQL stops evaluating the expression as soon as the result can be determined.
SQL> declare
2 v_day NUMBER := TO_CHAR(TO_DATE('20060101','YYYYMMDD'),'D');
3
4 function f_DayNr return NUMBER is
5 begin
6 DBMS_OUTPUT.put_line('Called function');
7 return v_day;
8 end;
9 begin
10 if f_DayNr in (1,7) or (f_DayNr not in (1,7) and (f_DayNr between 0 and 6 or f_DayNr between 19 and 23))
11 then
12 DBMS_OUTPUT.put_line(v_day || ': Off-peak');
13 else
14 DBMS_OUTPUT.put_line(v_day || ': Peak');
15 end if;
16 end;
17 /
Called function
1: Off-peak
PL/SQL procedure successfully completed.
SQL>