create or replace function GetWeekNum(I_VALUE IN date,--s
I_SP VARCHAR2 default null)
return VARCHAR2 as
/**
年開始第一天算第一週
一周從星期天開始 星期六結束
周計算
**/
V_BEGNUM NUMBER;
V_YD NUMBER;
V_BEGDT DATE;
V_BEGDTNUM NUMBER;
V_WN NUMBER;
begin
IF I_VALUE IS NULL THEN
RETURN NULL;
END IF;
V_BEGNUM := to_char(I_VALUE, 'd', 'NLS_DATE_LANGUAGE=AMERICAN') - 1;
V_YD := to_char(I_VALUE, 'ddd');
V_BEGDT := I_VALUE - V_YD + 1;
V_BEGDTNUM := to_char(V_BEGDT, 'd', 'NLS_DATE_LANGUAGE=AMERICAN') - 1;
V_WN := ceil(V_YD / 7);
if V_BEGNUM < V_BEGDTNUM then
V_WN := V_WN + 1;
end if;
return to_char(I_VALUE,'YYYY') || I_SP || to_char(V_WN, 'FM00');
end;