[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Jan 2008
    Beiträge
    58

    Exclamation Fehler bei SQL "date(....)" ?

    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.

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.243
    ... between current date - 7 days and current date ...

    now() = current date
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  3. #3
    Registriert seit
    Jan 2008
    Beiträge
    58
    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 ?

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.243
    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.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  5. #5
    Registriert seit
    Nov 2003
    Beiträge
    2.307
    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.

  6. #6
    Registriert seit
    Jan 2008
    Beiträge
    58
    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.

  7. #7
    Registriert seit
    Aug 2001
    Beiträge
    2.875
    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:

    PHP-Code:
    Date(Substr(Digits(ADatum), 12concat '.' concat  
         Substr
    (Digits(ADatum), 32concat '.' concat  
         
    Case When Substr(Digits(ADatum), 52) > '40'   
              
    Then '19' Else '20' End             
         Concat Substr
    (Digits(ADatum), 52
    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
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  8. #8
    Registriert seit
    Jan 2008
    Beiträge
    58
    Danke, Birgitta !
    Das war's !!!

    Problem geschlossen.

    Viele Grüße an *ALL

Similar Threads

  1. SQL Substring (Fehler 42703)
    By olbe in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 28-12-06, 13:53
  2. Finde Fehler bei SQL nich...
    By deni87991 in forum IBM i Hauptforum
    Antworten: 11
    Letzter Beitrag: 08-08-06, 13:50
  3. SQL UDF Function ausführung mit Fehler
    By jakarto in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 24-07-06, 13:41
  4. Fehler im SQL bzw. Joblog
    By GraueEminenz in forum NEWSboard Programmierung
    Antworten: 1
    Letzter Beitrag: 10-07-06, 11:58
  5. SQL - Fehler
    By Kaufmann in forum IBM i Hauptforum
    Antworten: 11
    Letzter Beitrag: 28-06-06, 14:11

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •