PDA

View Full Version : Fehler bei SQL "date(....)" ?



a.wojcik
24-07-08, 09:43
Hallo *ALL !
Folgene SQL Anweisung :
C/EXEC SQL
C+ Set :RecCount =
C+ (
C+ select count(*) from HARTPF
C+ where AKUNDE = :XKUNDE and AARTIK = :XARTIK
C+ and ADATUM > 0
C+ and date(concat(concat(substr(digits(ADATUM), 1, 2), '.'),
C+ concat(concat(substr(digits(ADATUM), 3, 2), '.'),
C+ substr(digits(ADATUM), 5, 2)) ))
C+ between DATE(DAYS(NOW()) - 7) and DATE(DAYS(NOW()))
C+ )
C/END-EXEC
wird im RPGLE Programm wegen Fehler :
SELECT/OMIT-Fehler in Feld (Cast((ISO Date/Time
formatting)CONCAT(SUBSTR(ChangeOfType(((Cast(ABS(H ARTPF_2.ADATUM¬127|),
Short Packed) AS Short Zoned))),DbopExprLiteral(1),DbopExprLiteral(2)),
DbopExprLiteral('.'),
SUBSTR(ChangeOfType(((Cast(ABS(HARTPF_2.ADATUM¬12 7|), Short Packed) AS
Short Zoned))),DbopExprLiteral(3),DbopExprLiteral(2)),Db opExprLiteral('.'),
SUBSTR(ChangeOfType(((Cast(ABS(HARTPF_2.ADATUM¬12 7|), Short Packed) AS
Short Zoned))),DbopExprLiteral(5),DbopExprLiteral(2))), Char Var Len,
max = 8 Pad(x
SELECT-/OMIT-Fehler in Teildatei QSQPTABL.
SELECT-/OMIT-Fehler in Teildatei QSQPTABL.
Wert in Datums-, Zeit- oder Zeitmarkenzeichenfolge ungültig.
nicht ausgeführt.
Es soll Anzahl in den letzten 7 Tagen geänderten Sätze ermittelt werden.
ADATUM ist ein 10-Stelliges dezimales Datumsfeld mit dem Inhalt TTMMJJHHSS .
Interaktiv funktioniert dieser SELECT prima.
Habe ich einen Fehler bei "date(....) between..." ?
Ev. andere Vorschläge zu o.g. Ermittlung ?
Gruß
A.W.

Fuerchau
24-07-08, 09:54
... between current date - 7 days and current date ...

now() = current date

a.wojcik
24-07-08, 10:15
Danke, Fuerchau für die prompte Antwort.
Habe ich gerade ausprobiert, leider mit dem gleichen Ergebnis.
Ich denke es liegt an dem CAST:
date( concat(concat(substr(digits(ADATUM), 1, 2), '.'),
concat(concat(substr(digits(ADATUM), 3, 2), '.'),
substr(digits(ADATUM), 5, 2)) ))
Aber wieso geht das interaktiv ?

Fuerchau
24-07-08, 10:37
Ah ja, du musst ein gültiges Datumsformat angeben, dass dem SQL-Datumsformat entspricht (set option datfmt=...).
Die H-Bestimmung hat damit nichts zu tun.

Die date-Funktion erkennt zwar viel, aber manchmal hapert es da doch.
Funktionieren tut immer das ISO-Format JJJJ-MM-TT unabhängig von jedweder Job-Einstellung.

Pikachu
24-07-08, 10:46
Kleiner Tipp zum CONCAT: Anstelle der Funktion CONCAT(a, b) kann auch der CONCAT-Operator "a CONCAT b" benützt werden. Dadurch werden mehrere verschachtelte CONCATs übersichtlicher.

a.wojcik
24-07-08, 10:50
Daran habe ich schon gedacht, im Pgm habe ich :
Set Option
Naming = *Sys,
Commit = *None,
UsrPrf = *User,
DynUsrPrf = *User,
Datfmt = *iso,
CloSqlCsr = *EndMod
Die Probleme habe ich mit dem Datumsfeld ADATUM (TTMMJJHHSS) muß ich vorhen in *ISO konvertieren.

B.Hauser
24-07-08, 11:02
Hallo,

das Problem ist, dass das Jahr in deinem Datums-Feld nur 2-stellig ist. Damit SQL einen alphanumerischen String in ein Datum verwandeln kann, ist ein 4-stelliges Jahr erforderlich!
Das ISO-Format ist 'JJJJ-MM-TT'. Dein Format ist TT.MM.JJ.

Versuch's mal wie folgt:



Date(Substr(Digits(ADatum), 1, 2) concat '.' concat
Substr(Digits(ADatum), 3, 2) concat '.' concat
Case When Substr(Digits(ADatum), 5, 2) > '40'
Then '19' Else '20' End
Concat Substr(Digits(ADatum), 5, 2)


Interaktiv funktioniert es deshalb, weil Dein Job-Format vermutlich DMY ist. Auch das kann SQL erkennen. Wenn Du das Datums-Format über F13, Auswahl 1 auf ISO setzt, wirst Du die Abfrage ebenfalls nicht mehr ausführen können.
In Deinem SQL-Programm geht es schief, weil nicht das Job-Format, sonder *ISO als Datums-Format für die SQL-Abfragen verwendet wird.

Birgitta

a.wojcik
24-07-08, 11:09
Danke, Birgitta !
Das war's !!!

Problem geschlossen.

Viele Grüße an *ALL