用php寫了一個函數,實現的功能是 計算兩個日期之間的工做日天數-除去(週末和公共假日)寫了 300多行的代碼, 實現公共假日從文件中讀取, 或者從數據庫提取, 而後傳入兩個日期,就能返回想要的結果, 無奈之下想到了PLSQL, 同事幾分鐘後給我一段簡短的代碼. 着實讓我吃了一驚..
下面是代碼:
CREATE OR REPLACE FUNCTION calcDates(START_DATE IN DATE, END_DATE IN DATE)
RETURN number IS
No_of_DAYS number;
BEGIN
IF START_DATE < END_DATE THEN
SELECT count(1) days
INTO NO_OF_DAYS
FROM (SELECT DISTINCT trunc(START_DATE) + level - 1 dayList
FROM dual
connect BY trunc(START_DATE) + level - 1 < = trunc(END_DATE)) A
where not exists (select 1
from dp_tbl_public_holiday b
where to_date(b.ph_date, 'YYYYMMDD') = A.dayList)
and to_char(dayList, 'D') not in (1, 7);
ELSE
SELECT 0 - count(1) days
INTO NO_OF_DAYS
FROM (SELECT DISTINCT trunc(END_DATE) + level - 1 dayList
FROM dual
connect BY trunc(END_DATE) + level - 1 < = trunc(START_DATE)) A
where not exists (select 1
from dp_tbl_public_holiday b
where to_date(b.ph_date, 'YYYYMMDD') = A.dayList)
and to_char(dayList, 'D') not in (1, 7);
END IF;
Return No_of_DAYS;
END;
註釋:
1.dp_tbl_public_holiday
存儲着 假期的性息, ph_date 假期的日期.
2.to_char(dayList, 'D') not in (1, 7);
這個強大的 to_char(dayList, 'D')返回的是 日期是星期幾,就比如是java裏面的 Calendar.DAY_OF_WEEK,
not in (1, 7)就是不在週六或者週日, 1是週日, 7是週六 ,這個和java同樣.
3.trunc(START_DATE) trunc 函數拿到的是日期的值,忽略小時數.
4.SELECT DISTINCT trunc(START_DATE) + level - 1 dayList
FROM dual
connect BY trunc(START_DATE) + level - 1 < = trunc(END_DATE)
這段代碼就是列出兩個日期之間全部日期. connect by 和 level 是個深奧的東東.須要好好消化`
就這樣, 先後不到30行的代碼, 解決了問題!!
!php