Da Datumswerte intern als Zahlen räpresentiert werden, kann man mit ihnen rechnen (Einheit ist der Tag, also select sysdate + 1 from dual => 20.10.2000).
Um auf eine Woche zu kommen, mußt Du den 1.1. + (Wochenzahl) * 7 nehmen. War der 1.1. z.B. ein Mittwoch, mußt Du 3 Tage davon abziehen, um auf den ersten Tag der Woche zu kommen.
Dafür gibt es die Funktion to_char(, ‚d‘), die ergibt 1, 2, 3…7 für Montag, Dienstag, usw. Da das Ergebnis mit 1 statt mit 0 anfängt, zieht man 1 zuviel ab, deswegen mußt Du 1 dazugeben.
select
to\_date('01.01.2000', 'dd.mm.yyyy') -
to\_char(to\_date('01.01.2000', 'dd.mm.yyyy'), 'd') + 1 +
42 \* 7 ErsterTag
from dual;
Wenn Du das speziell konvertiert haben willst, mußt Du das tun:
select to\_char(
to\_date('01.01.2000', 'dd.mm.yyyy') -
to\_char(to\_date('01.01.2000', 'dd.mm.yyyy'), 'd') + 1 +
42 \* 7, 'dd.mm.yyyy') ErsterTag
from dual;
Du kannst das in eine Funktion packen:
create or replace function ErsterWochentag( Woche IN Number) RETURN varchar2 is
ret varchar2(10);
begin
select to\_char(
to\_date('01.01.2000', 'dd.mm.yyyy') -
to\_char(to\_date('01.01.2000', 'dd.mm.yyyy'), 'd') + 1 +
42 \* 7, 'dd.mm.yyyy') into ret
from dual;
return ret;
end;
select ErsterWochentag(42) ErsterTag from dual;
ERSTERTAG
-----------
16.10.2000
1 row selected.
Du kannst die Funktion um die Jahreszahl erweitern, dann geht das auch für nächstes Jahr:
create or replace function ErsterWochentag( Woche IN Number, Jahr IN number) RETURN varchar2 is
ret varchar2(10);
begin
select to\_char(
to\_date('01.01.' || Jahr, 'dd.mm.yyyy') -
to\_char(to\_date('01.01.' || Jahr, 'dd.mm.yyyy'), 'd') + 1 +
42 \* 7, 'dd.mm.yyyy') into ret
from dual;
return ret;
end;
select ErsterWochentag(42, 1999) ErsterTag from dual;
ERSTERTAG
-----------
18.10.1999
1 row selected.
Ich habe mich schon häufig mit dem Thema beschäftigt, das ist echt nervend
Gruß
J.