Aby spełnić Twoje wymagania, musisz użyć kombinacji IW
i WW
format. Możesz je połączyć za pomocą CASE wyrażenie.
Jeśli chcesz wygenerować listę dat dla całego roku, możesz użyć generator wierszy metoda.
SQL> WITH sample_data AS(
2 SELECT DATE '2015-12-28' + LEVEL -1 dt FROM dual
3 CONNECT BY LEVEL <= 15
4 )
5 -- end of sample_data mimicking real table
6 SELECT dt,
7 TO_CHAR(dt, 'DY') DAY,
8 NVL(
9 CASE
10 WHEN dt < DATE '2016-01-01'
11 THEN TO_CHAR(dt, 'IW')
12 WHEN dt >= next_day(TRUNC(DATE '2016-01-01', 'YYYY') - 1, 'Monday')
13 THEN TO_CHAR(dt +7, 'IW')
14 END, '01') week_number
15 FROM sample_data;
DT DAY WEEK_NUMBER
---------- --- -----------
2015-12-28 MON 53
2015-12-29 TUE 53
2015-12-30 WED 53
2015-12-31 THU 53
2016-01-01 FRI 01
2016-01-02 SAT 01
2016-01-03 SUN 01
2016-01-04 MON 02
2016-01-05 TUE 02
2016-01-06 WED 02
2016-01-07 THU 02
2016-01-08 FRI 02
2016-01-09 SAT 02
2016-01-10 SUN 02
2016-01-11 MON 03
15 rows selected.
UWAGA:
Wartość 15
do wygenerowania 15 wierszy, a daty są zakodowane powyżej tylko w celu demonstracji przy użyciu klauzuli WITH, ponieważ OP nie dostarczył przypadku testowego z instrukcjami tworzenia i wstawiania. W rzeczywistości musisz użyć nazw tabel i kolumn.