PDA

View Full Version : jjjj + mm +tt mit sql 5 tage drauf



Seiten : [1] 2

ILEMax
02-08-12, 09:11
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

Fuerchau
02-08-12, 09:27
Wiederum per Cast:

dec(replace(char(DateAusdruck, iso), '-', ''), 8, 0)

Zur Datumsrechnung gilt:

+/- n days | months | years

B.Hauser
02-08-12, 09:50
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

ILEMax
02-08-12, 09:52
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

ILEMax
02-08-12, 09:53
ok, das ISO kam aber später oder??

(Danke)

ILEMax
02-08-12, 10:18
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 +++++

ILEMax
02-08-12, 10:26
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

Fuerchau
02-08-12, 10:37
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.

Fuerchau
02-08-12, 10:39
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.

ILEMax
02-08-12, 10:56
Sowas hatte ich auch kurz überlegt aber ...
knallt der nicht, wenn ich - 5 days rechne ?

Der ILEMax