1 CREATE OR REPLACE FUNCTION f_week_to_date(a_week varchar2) RETURN CHAR IS
2 v_first_date char(10);
3 v_date_of_week number(1);
4
5 BEGIN
6 select to_char(to_date(substr(a_week, 1, 4) || '0101', 'yyyymmdd'), 'D')
7 into v_date_of_week
8 from dual;
9 v_date_of_week := v_date_of_week - 1;
10 if v_date_of_week <= 4 then
11 select TO_CHAR(TO_DATE(SUBSTR(a_week, 1, 4) || '0101', 'yyyymmdd') +
12 SUBSTR(a_week, 5, 2) * 7 - 7 - v_date_of_week + 1,
13 'yyyy-mm-dd')
14 into v_first_date
15 from dual;
16 else
17 select TO_CHAR(TO_DATE(SUBSTR(a_week, 1, 4) || '0101', 'yyyymmdd') +
18 SUBSTR(a_week, 5, 2) * 7 - v_date_of_week + 1,
19 'yyyy-mm-dd')
20 into v_first_date
21 from dual;
22 end if;
23
24 return v_first_date;
25
26 END;