SELECT mit spezieller Datumskonvertierung (Oracle)

Hallo SQL-Freaks,

habe ORACLE 8i und suche einen SELECT, der mir den ersten Tag im Format MM.DD.YYYY einer definierten Kalenderwoche ausgibt.

Bsp: ich möchte von der Kalenderwoche 42 den ersten Tag der Woche -> Ergebnis wäre 16.10.

Mit normalen to_date bzw. to_char Klauseln habe ich noch nichts gefunden. ORACLE kann z.B. aus einer KW kein komplettes Date ermittlen, da die Arguente nicht eindeitig sind.

Wer weiß etwas. Wenn nicht mit Oracle, dann vielleicht mit Java’s Calendar oder Date - Bibliotheken.

Ciao.
D.R.

SELECT TO_CHAR(Datumherkunft,‚MM.DD.YYYY‘) [Alias]
FROM
WHERE TO_DATE(‚20‘, WW); --Hier die 20ste KW

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

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 :frowning:

Gruß

J.

Vielen Dank, einfach genial.

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;

Übrigens die 42 habe ich noch durch die Variable ‚Woche‘ ersetzt.

Ciao J.,
D.R.

1 Like

Übrigens die 42 habe ich noch durch die Variable ‚Woche‘
ersetzt.

Ups! Rate mal, mit welchem Wert ich das getestet habe…
Gruß

J.

Hier noch eine einfachere Methode:
SELECT TO_CHAR(TO_DATE(‚20001206‘, ‚YYYYMMDD‘),‚WW‘)
FROM DUAL

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

very easy :
SELECT TO_CHAR(TO_DATE(‚20001206‘, ‚YYYYMMDD‘),‚WW‘) FROM DUAL

Hallo SQL-Freaks,

habe ORACLE 8i und suche einen SELECT, der mir den ersten Tag
im Format MM.DD.YYYY einer definierten Kalenderwoche ausgibt.

Bsp: ich möchte von der Kalenderwoche 42 den ersten Tag der
Woche -> Ergebnis wäre 16.10.

very easy :
SELECT TO_CHAR(TO_DATE(‚20001206‘, ‚YYYYMMDD‘),‚WW‘) FROM DUAL

Hmmm… Ja, toll. Damit habe ich die Kalenderwoche eines Datums ermittelt, aber nicht das Datum des Monats einer bestimmten Kalenderwoche, was gefragt war…

Gruß

J.

Ooops, manchmal ist es doch hilfreich, wenn man den Text GENAU(!) liest und nicht nur überfliegt! Sorry, mein Fehler (8-o

Gruß ms

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]