報表開發、資料統計常需按「週」切分資料。Oracle 無內建 WEEK_START 函數,但可善用 TRUNC 與 TO_CHAR 組合快速計算。
TRUNC(sysdate, 'DD') 取得今日零點;TO_CHAR(sysdate, 'D') 回傳星期幾(1=週日 ... 7=週六,視 NLS_TERRITORY 而定)。以 **週一為週首** 為例:
SELECT TRUNC(SYSDATE, 'DD') - TO_CHAR(SYSDATE, 'D') + 2 AS week_start
FROM dual;
SELECT TRUNC(SYSDATE, 'DD') - TO_CHAR(SYSDATE, 'D') + 8 AS week_end
FROM dual;
NLS_TERRITORY=AMERICA(週日為週首),週一公式改為 +1,週日為 +7。TO_CHAR(sysdate, 'D', 'NLS_DATE_LANGUAGE=AMERICAN') 避免環境差異導致錯誤。WITH params AS (
SELECT DATE '2024-03-15' AS target_date FROM dual
)
SELECT
target_date,
TRUNC(target_date, 'DD') - TO_CHAR(target_date, 'D', 'NLS_DATE_LANGUAGE=AMERICAN') + 2 AS week_monday,
TRUNC(target_date, 'DD') - TO_CHAR(target_date, 'D', 'NLS_DATE_LANGUAGE=AMERICAN') + 8 AS week_sunday
FROM params;
FUNCTION get_week_start(p_date DATE) RETURN DATE 供重複呼叫。WEEK_START_DT, WEEK_END_DT,查詢時直接 JOIN 避免重複運算。TRUNC(date, 'IW')(ISO 週一為週首)。