[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte
  1. #1
    Registriert seit
    Apr 2012
    Beiträge
    360

    Sql decimal to Date

    Hallo,

    wie müsste mein Statement aussehen, damit ich ungültige Daten(falsches Datum, Wert = 0) abfangen kann?
    start_D = Dec 8,0

    Code:
    SELECT 
    IFNULL(Date(to_date(char(start_D), 'YYYYMMDD')) ,  
    '1900-01-01') as start_D 
    FROM TESTFILE
    Mit IfNull hat das nicht so funktioniert, wie ich mir das vorgestellt habe.

    Dank im Voraus

    Tarki

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Der nullif muss in die unterste Ebene.
    .....nullif(start_d, 0).....
    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
    Apr 2012
    Beiträge
    360
    Sorry,

    leider stehe ich völlig auf dem Schlauch mit "unterste Ebene".
    Wie ist das gemeint. Dachte immer ifnull muss ganz am Anfang stehen.
    Nullif hatte ich noch nicht in Verwendung.

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Grundsätzlich gilt:
    Ist ein Teilergebnis eines Ausdruckes NULL, ist der gesamte Ausdruck NULL.
    Nun meldet dir "to_Date" den Fehler, dass kein Datum in dem unteren Ausdruck steckt.
    Nun muss also die tiefste Ebene den NULLIF enthalten:
    ...char(NULLIF(START_D, 0))...
    Dies ergibt NULL für die CHAR-Funktion, die nun NULL liefert.
    TO_DATE erhält nun ebenso NULL und liefert dann NULL als Ergebnis, so dass nun IFNULL das 2. Element liefern kann.
    IFNULL entspricht der COALESCE-Funktion, mit der Ausnahme, dass nur 2 Argumente verwendet werden können.
    NULLIF liefert NULL, wenn der Vergleich identisch ist. Ebenso aber auch, wenn ein Argument NULL ist.

    Eine Funktion, die das gewünschte Ergebnis nicht bringen kann, wirft eine Exception aus, die den gesamten SQL abbricht. Ein Abfangen so ist nicht möglich.
    Mittels NULLIF kann man aber einen Vergleich anstellen, der die Gültigkeit (eingeschränkt) prüfen kann.
    NULLIF entspricht:
    case when Feld is null then null else feld end
    Und somit kann man hier ebenso andere Püfungen in einem Case-Ausdruck durchführen, die im Fehlerfall eben NULL, alternativ aber auch einen Default liefern können:

    case when start_d = 0 then 19000101 else start_d end

    Du sieht, es gibt viele Wege zum Erfolg.
    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
    Apr 2012
    Beiträge
    360
    Danke, danke für die ausführliche Erklärung.

  6. #6
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    Wenn Du allerdings ein anderes ungültiges numerisches Datum (außer 0) hast, hast Du Dich wieder gebissen.

    Ich würde eine kleine SQL-Funktion schreiben, die die Konvertierung macht und im Fehler-Fall das Default-Datum ausgibt.
    Etwa so:
    Code:
    Create Function YourSchema / NUM2DATE(DATENUM Decimal(8, 0))
       Returns Date
       Language Sql
       Deterministic
       Reads Sql Data
       Called On Null Input
       Begin
          Declare Continue Handler For SQLEXCEPTION
             Return Date('1900-01-01') ;
          Return Date(Digits(DATENUM) concat '000000') ;
       End;
    Aufruf ist dann:
    Code:
    Select Num2Date(NumYYYYMMDD)
       From ...
    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

  7. #7
    Registriert seit
    Apr 2012
    Beiträge
    360
    Danke für die ausführliche Informationen.

  8. #8
    Registriert seit
    Nov 2006
    Beiträge
    102
    Hallo Birgitta,
    ich habe gerade diesen für mich sehr hilfreichen Beitrag gefunden.
    Ich bin jetzt auf folgendes Problem gestoßen: Wenn ich die Funktion anwende auf eine Spalte, die auch in der Where-Klausel steht, wird meine Abfrage nicht ausgeführt und ich bekomme auf der unteren Nachrichtenebene Datenzuordnungsfehler in der Datei QSQPTABL, Fehlercode 18 (=Datums-, Zeit- oder Zeitmarkenfeld enthält ungültige Daten.
    Erklären kann ich mir das nicht. Wenn ich das Feld aus der Where-Klausel rausnehme läuft alles wunderbar. Hast Du eine Idee, woran das liegen könnte?

  9. #9
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Dann zeige mal dein SQL.
    Ein Problem besteht immer:
    Die Ausdrücke der Select-Liste werden zuerst ausgeführt, bevor die Where-Klausel geprüft wird.
    Das wurde irgenwann zu V6R1 umgestellt.

    Also im Prinzip so:

    select * from (
    Select ....) x
    where ...

    Somit musst du bereits im Select-Ausdruck einen gültigen Wert angeben.

    Besser wäre dann ein

    select f1 f2, calcdate, ...
    from (
    select * from table
    where datum = gültig
    ) x
    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

  10. #10
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    ... das liegt an der Auswertungsreihenfolge: Where wird vor dem select ausgeführt. Damit das wie gewünscht funzt, musst Du die Funktion in der Where Klausel ebenfalls einbinden.

    D*B
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  11. #11
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    @DB: das war früher so, denn ich hatte SQL-Import und ungültige Daten per where ausgefiltert. Im Select hatte ich mich auf den Filter verlassen.
    Mit dem Releaseupdate fiel der SQL dann auf die Nase, da doch zuerst der Select und dann der Where ausgeführt wurde. Warum auch immer...
    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

  12. #12
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    Zitat Zitat von Fuerchau Beitrag anzeigen
    Die Ausdrücke der Select-Liste werden zuerst ausgeführt, bevor die Where-Klausel geprüft wird.
    Das wurde irgenwann zu V6R1 umgestellt.
    ... das sollte mich wundern, das wäre eine Abkehr vom ANSI Standard.
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

Similar Threads

  1. SQL Frage Uhrzeit aus Decimal Feld
    By Franz.Rung in forum IBM i Hauptforum
    Antworten: 12
    Letzter Beitrag: 10-08-15, 12:34
  2. SQL Probleme numerischen Werten - decimal
    By itec01 in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 07-08-14, 14:29
  3. SQL Convert Date to Decimal
    By TheDevil in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 27-03-14, 13:34
  4. Typ DATE in SQL-Tabelle
    By Melanie in forum IBM i Hauptforum
    Antworten: 5
    Letzter Beitrag: 13-02-03, 10:30
  5. Mit THINXX jederzeit up to date
    By Kirsten Steer in forum Archiv NEWSblibs
    Antworten: 0
    Letzter Beitrag: 06-06-02, 08:54

Berechtigungen

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