Oracle DB - Select liefert Fehler aufgrund ungültigen Monats obwohl die betreffenden Zeilen ausgeschlossen sind
Ich habe einen Fehler in meinem Select, welcher mir ein ungültiges Datumsformat liefert. Durch diesen Fehler läuft der Select generell auf eine Exception hinaus.
Moin allerseits.
Vielleicht kann mir jemand mit einem Select weiterhelfen, der mich so langsam ratlos macht. Daher wollt ich mal gucken ob ihr da noch eine Lösung wisst.
nicht wundern, da sind teile von VisualBasic.Net drin. Der select wird von einem Programm ausgeführt welches den Bestand von Paletten zu einem bestimmten Zeitpunkt ausgibt.
Das betreffende Datumsfeld hat die bezeichnung "wadat_ist"
Die falschen Werte im Feld "wadat_ist" die NICHT verändert werden dürfen haben den Wert "00000000"
Problem ist:
- es gibt falsche Datumseinträge in der Tabelle, die ich aufgrund angeschlossener SAP Systeme nicht ändern kann
- das Feld wo das datum enthalten ist ist vom Typ VARCHAR2(8), was natürlich unpraktisch ist aber nicht verändert werden darf (ebenso wegen SAP)
Any Ideas?
Gruß,
Jan
Moin allerseits.
Vielleicht kann mir jemand mit einem Select weiterhelfen, der mich so langsam ratlos macht. Daher wollt ich mal gucken ob ihr da noch eine Lösung wisst.
SELECT SUM(ZZLIEFG - ZZRUECKG)
FROM ZSD_PALETTEN_VIEW
WHERE wadat_ist != 00000000
and ZZPAL_ART = to_number('" & Hauptfenster.ComboBox_StatBestPalchooser.SelectedValue & "')
and to_date(WADAT_IST, 'YYYYMMDD') <= to_date('" & datumlast & "', 'DD.MM.YYYY HH24:MI:SS')
nicht wundern, da sind teile von VisualBasic.Net drin. Der select wird von einem Programm ausgeführt welches den Bestand von Paletten zu einem bestimmten Zeitpunkt ausgibt.
Das betreffende Datumsfeld hat die bezeichnung "wadat_ist"
Die falschen Werte im Feld "wadat_ist" die NICHT verändert werden dürfen haben den Wert "00000000"
Problem ist:
- es gibt falsche Datumseinträge in der Tabelle, die ich aufgrund angeschlossener SAP Systeme nicht ändern kann
- das Feld wo das datum enthalten ist ist vom Typ VARCHAR2(8), was natürlich unpraktisch ist aber nicht verändert werden darf (ebenso wegen SAP)
Any Ideas?
Gruß,
Jan
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 131698
Url: https://administrator.de/contentid/131698
Ausgedruckt am: 22.11.2024 um 20:11 Uhr
12 Kommentare
Neuester Kommentar
Moin Jan Korte,
Wäre dann nicht
Zusatzfragen:
Grüße
Biber
... WHERE wadat_ist != 00000000
Erwähntest du nicht, dass wadat_ist eigentlich ein VARCHAR2(8)-Feld ist?Wäre dann nicht
...WHERE wadat_ist != '00000000'
...ein besserer Einstieg?Zusatzfragen:
- Wie gehst du denn inhaltlich mit den "ungültigen" Datumswerten um? Fallen die vollkommen unter den Tisch?
- wenn ja - wieso filterst du die nicht komplett raus schon im ZSD_PALETTEN_VIEW?
- wenn nein - warum setzt du die nicht schon im eben genannten View auf einen "erkennbaren" Wert von z.B. '31.12.9999' oder ähnlich, damit sie logisch richtig verarbeitbar sind?
Grüße
Biber
Moin Jan Korte,
Also, richtig ist: Oracle kennt von Haus aus keine vorgefertigte IsDate()-Funktion, die du ja eigentlich brauchst.
Aber: Ja hey! Dann braten wir halt eine zusammen. Denn ein Oracle-Server ist ja offensichtlich im Hintergrund, und der hat immer Spaß an so was.
Eine einfache (aber ausreichende) Implemetierungsskizze findest du z.B bei AskTom,
eine etwas aufwändigere (aber brauchbarere) hier.
Irgendwo zwischen diesen beiden Extremen solltest du deine passende Lösung zusammenschroten.
Grüße
Biber
Hoffnungslose Sache im Moment
Na ja, wenn du meine Ex-Schwiegermutti kennengelernt hättest, dann würdest du nicht so leichtfertig mit dem Begriff "hoffnungslos" umgehen.Also, richtig ist: Oracle kennt von Haus aus keine vorgefertigte IsDate()-Funktion, die du ja eigentlich brauchst.
Aber: Ja hey! Dann braten wir halt eine zusammen. Denn ein Oracle-Server ist ja offensichtlich im Hintergrund, und der hat immer Spaß an so was.
Eine einfache (aber ausreichende) Implemetierungsskizze findest du z.B bei AskTom,
eine etwas aufwändigere (aber brauchbarere) hier.
Irgendwo zwischen diesen beiden Extremen solltest du deine passende Lösung zusammenschroten.
Grüße
Biber
Moin Jan Korte,
Könnte es daran liegen, dass das Funktionsargument von to_date() ein konstanter String ist?
Grüße
Biber
Irgendwie hab ich das Gefühl das mich da wer nicht mag ^^
Na ja, wenn du meine Ex-Schwiegermutti kennengelernt hättest, dann würdest du nicht so leichtfertig mit dem Begriff .....Könnte es daran liegen, dass das Funktionsargument von to_date() ein konstanter String ist?
Select to_date('wadat_ist', 'YYYYMMDD')
Grüße
Biber
Moin Jan Korte,
kein Oracle dieser Welt kann so widerborstig sein wie meine Ex-Schwiegermutti... das knacken wir *gg
Dennoch - ich sehe auch (noch) nicht den logischen Trugschluss in "unserer" Vorgehensweise...
Die IsDate()-Funktion habe ich auch testweise bei mir (Oracle 10/11) installiert und okay, die works as designed.
Gut, ist ein bisschen albern mit den String-Rückgaben 'true' und 'false'.. das hätte ich evtl. ein bisschen anders gelöst.
Außerdem - was nicht mit deiner Fehlermeldung korrespondiert - sowohl "gültige" Datumsangaben aus dem Jahr 0 wie auch negative Jahreszahlen liefern mit der IsDate()-Funktion ein 'false'. hab ich jetzt nicht wirklich verstanden, aber hilft ja auch jetzt nicht weiter.
Also, dann wäre doch der nächste Schritt zur Lokalisierung der Sollbruchstelle, alle Sätze rauszupfriemeln, die laut Isdate(wadat_ist) 'true' zurückliefern, bei denen aber der Monat (Pos 5/6 des Varchar-Strings) nicht zwischen 1 und 12 liegt..
oder so ähnlich
Grüße
Biber
kein Oracle dieser Welt kann so widerborstig sein wie meine Ex-Schwiegermutti... das knacken wir *gg
Dennoch - ich sehe auch (noch) nicht den logischen Trugschluss in "unserer" Vorgehensweise...
Die IsDate()-Funktion habe ich auch testweise bei mir (Oracle 10/11) installiert und okay, die works as designed.
Gut, ist ein bisschen albern mit den String-Rückgaben 'true' und 'false'.. das hätte ich evtl. ein bisschen anders gelöst.
Außerdem - was nicht mit deiner Fehlermeldung korrespondiert - sowohl "gültige" Datumsangaben aus dem Jahr 0 wie auch negative Jahreszahlen liefern mit der IsDate()-Funktion ein 'false'. hab ich jetzt nicht wirklich verstanden, aber hilft ja auch jetzt nicht weiter.
Also, dann wäre doch der nächste Schritt zur Lokalisierung der Sollbruchstelle, alle Sätze rauszupfriemeln, die laut Isdate(wadat_ist) 'true' zurückliefern, bei denen aber der Monat (Pos 5/6 des Varchar-Strings) nicht zwischen 1 und 12 liegt..
SELECT * from PALETTEN.ZSD_PALETTEN_VIEW
Where isdate(wadat_ist) = 'true'
And ( Substr(wadat_ist, 5, 2) < '01' or Substr( wadat_ist, 5, 2) >'12' )
Grüße
Biber