View Full Version : jjjj + mm +tt mit sql 5 tage drauf
Hi *all
ich habe in einer Datei das Datum in form von 3 Feldern.
jjjj, mm und tt
in einer View will ich nun auf das Datum 5 Tage drauf rechnen.
Das ergebnis brauche ich aber als ein Numerisches Feld jjjjmmtt
bisher habe ich ...
date((digits(jjjj) CONCAT '-' CONCAT digits(mm) CONCAT '-' CONCAT
digits(tt))-DAYS(5)
Das bekomme ich z.zt. nicht zurück in ein jjjjmmtt Feld
Danke
Der ILEMax
Wiederum per Cast:
dec(replace(char(DateAusdruck, iso), '-', ''), 8, 0)
Zur Datumsrechnung gilt:
+/- n days | months | years
Sofern Du auf Release 6.1 oder höher bist, kannst Du den ganzen Ausdruck (zusammensetzen Felder, Konvertieren in Datum, 5 Tage addieren, Konvertieren in Numerisches Datum) auch wie folgt aufbauen:
Dec(VarChar_Format(Timestamp(Digits(Jahr) concat
Digits(Monat) concat
Digits(Tag) concat '000000') + 5 Days,
'YYYYMMDD'),
8, 0)
Birgitta
ok, danke.
habe mein -days(5) in -5 days geändert.
dec(replace(char(
date((digits(jjjj) CONCAT '-' CONCAT digits(mm) CONCAT '-' CONCAT
digits(tt)))-5 DAYS
), '-', ''), 8, 0) AS DATUM,
geht aber nicht.
Ursache schein zu sein, das
SELECT date(digits(JJJJ) CONCAT '-' CONCAT digits(MM) CONCAT
'-' CONcat digits(TT))-5 DAYS AS DATUM,
JJJJ*10000+MM*100+TT FROM DATEI
BRINGT
16.09.95 19950621 also richtig gerechnet aber Datum in Form tt.mm.jj
der replace und das Dec 8,0 kann da ja nicht funktionieren
noch ne Idee?
Der ILEMax
ok, das ISO kam aber später oder??
(Danke)
leider gibt es auch jjjj mm und tt Felder die leer sind.
Um das abzufangen habe ich nun
SELECT dec(coalesce(replace(char( date(digits(jjjj) CONCAT '-'
CONCAT digits(mm) CONCAT '-' CONcat digits(tt))-5 DAYS ,
iso), '-', ''), 0), 8, 0) AS DATUM, jjjj*10000+mm*100+tt
FROM datei
drumherum gebaut
das bringt aber bei den leeren jjjj Feldern zrotzdem in der Anzeige nur +++++
SELECT Dec(coalesce(VarChar_Format(Timestamp(Digits(jjjj) concat
Digits(mm) concat Digits(tt) concat '000000')+ 5 Days ,
'YYYYMMDD'), 0), 8, 0) , jjjj*10000+mm*100+tt FROM datei
Ungültige Daten kann man da leider nicht in ein Datum umsetzen, dass kannst du nur mit einem Case-Ausdruck eingrenzen.
Zusätzlich passiert ja noch folgendes:
Im STRSQL, also Dialog, schafft SQL es diese Daten dann zu überlesen.
Im embedded SQL geht das nur, wenn du NULL-Anzeiger verwendest, ansonsten kommt ein Fetch nicht über den fehlerhaften Satz hinaus.
Solange du sicher sein kannst, dass in den Daten, wenn sie <> 0 sind, nur gültige Daten drinn stehen, kannst du einen Case-Ausdruck verwenden:
case
when JJJJ <> 0 and MM <> 0 and TT <> 0
then DateAusdruck
else NULL
end
Auch hier benötigst du natürlich bei embedded SQL einen NULL-Anzeiger.
PS:
ISO kam tatsächlich erst beim Edit, das das Datumformat bei mir in STRSQL immer auf *ISO steht.
Ach übrigens:
man kann auch folgendes kodieren:
date('0001-01-01') + (JJJJ - 1) years + (MM - 1) months + (TT - 1) days
Das liefert dir dann immer ein gültiges Datum.
Sowas hatte ich auch kurz überlegt aber ...
knallt der nicht, wenn ich - 5 days rechne ?
Der ILEMax