Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Oracle DB - Select liefert Fehler aufgrund ungültigen Monats obwohl die betreffenden Zeilen ausgeschlossen sind

Frage Entwicklung Datenbanken

Mitglied: JanKorte

JanKorte (Level 1) - Jetzt verbinden

15.12.2009 um 10:10 Uhr, 9571 Aufrufe, 12 Kommentare

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.

01.
SELECT SUM(ZZLIEFG - ZZRUECKG)  
02.
FROM ZSD_PALETTEN_VIEW  
03.
WHERE wadat_ist != 00000000  
04.
and ZZPAL_ART = to_number('" & Hauptfenster.ComboBox_StatBestPalchooser.SelectedValue & "')   
05.
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
Mitglied: Biber
15.12.2009 um 11:27 Uhr
Moin Jan Korte,

... 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
Bitte warten ..
Mitglied: JanKorte
15.12.2009 um 14:12 Uhr
klar,... die Anführungszeichen. Die hatte ich jetzt beim Übertragen vergessen, sind aber vorhanden. Da ich nicht persönlich für den View verantwortlich bin habe ich die Anpassung mal grad weitergegeben.

Wenns was neues gibt meld ich mich nochmal, ansonsten vielen Dank für den Hinweis auf die Banalität die ich übersehen hab ^^.

Gruß, Jan
Bitte warten ..
Mitglied: JanKorte
15.12.2009 um 15:11 Uhr
Also,.. der Fehler besteht weiterhin.

Es muss in der Tabelle wohl mehrere Einträge geben, die kein Datumsformat besitzen. Da hilft es mir auch nicht die Einträge mit dem Wert '00000000' auszufiltern, weil es noch hunderte andere gibt, die ein falsches Format besitzen.

Dumm gelaufen.

Gibt es nicht irgendeine Abfrage, die ungültige Datumsfelder findet und anzeigt? Bzw. eine Selectanweisung mit der man die ausfiltern kann ohne jeden einzelnen Eintrag zu durchsuchen?

Hoffnungslose Sache im Moment. Ich hoffe Ihr wisst Rat .


Gruß, Jan
Bitte warten ..
Mitglied: Biber
15.12.2009 um 15:35 Uhr
Moin Jan Korte,

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
Bitte warten ..
Mitglied: JanKorte
15.12.2009 um 16:27 Uhr
So,

ich habe dann mal ne Funktion eingebaut und hab die daten mit folgender Funktion getestet:

01.
create or replace 
02.
function IsDate (str varchar2) return varchar2 is 
03.
inDate varchar2(40); 
04.
 
05.
FUNCTION dateCheck (inputDate varchar2, inputMask varchar2) 
06.
RETURN varchar2 
07.
IS 
08.
dateVar date; 
09.
 
10.
BEGIN 
11.
dateVar:= to_date(inputDate,inputMask); 
12.
return 'true'; 
13.
exception 
14.
when others then 
15.
return 'false'; 
16.
END; 
17.
 
18.
BEGIN 
19.
inDate:= trim(str); 
20.
if dateCheck(inDate, 'yyyymmdd') = 'false' 
21.
then 
22.
return 'false'; 
23.
else 
24.
return 'true'; 
25.
end if; 
26.
END;
Soweit so gut.

Der Testquery lautete folgendermaßen:

01.
Select wadat_ist, isdate(wadat_ist) from zsd_paletten_view;
Hier wurde kein Fehler in der Datenbanktabelle gefunden bis auf die mit '00000000' was mit ja generell zeigt das ISDATE() funktioniert.

Habe ich aber nun den Select erweitert und:

01.
Select to_date('wadat_ist', 'YYYYMMDD'), isdate(wadat_ist) from zsd_paletten_view where isdate(wadat_ist) = 'true';


angegeben, haut der mir wieder einen Fehler raus:
01.
Error report: 
02.
SQL Error: ORA-01841: (Volles) Jahr muss zwischen -4713 und +9999 liegen und darf nicht 0 sein 
03.
01841. 00000 -  "(full) year must be between -4713 and +9999, and not be 0" 
04.
*Cause:    Illegal year entered 
05.
*Action:   Input year in the specified range
Irgendwie hab ich das Gefühl das mich da wer nicht mag ^^
Bitte warten ..
Mitglied: Biber
15.12.2009 um 16:40 Uhr
Moin Jan Korte,

Zitat von JanKorte:

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
Bitte warten ..
Mitglied: JanKorte
15.12.2009 um 19:04 Uhr
jau,.. zumindestens das war ein Flüchtigkeitsfehler.

haben den View jetzt angepasst und ihm in seinen eingenen select folgendes gegeben;

01.
CREATE OR REPLACE FORCE VIEW "PALETTEN"."ZSD_PALETTEN_VIEW" ("MANDT", "KUNAG", "KUNNR", "ZZPAL_ART", "WADAT_IST", "VBELN", "VTEXT", "ZZLIEFG", "ZZRUECKG", "NAME1", "NAME2") AS  
02.
  SELECT "MANDT", 
03.
          "KUNAG", 
04.
          "KUNNR", 
05.
          "ZZPAL_ART", 
06.
        "WADAT_IST", 
07.
          "VBELN", 
08.
          "VTEXT", 
09.
          "ZZLIEFG", 
10.
          "ZZRUECKG", 
11.
          "NAME1", 
12.
          "NAME2" 
13.
     FROM zsd_paletten@sap_prod 
14.
     WHERE isdate(wadat_ist) = 'true';
die Zeile
01.
WHERE isdate(wadat_ist) = 'true';
sollte jetzt jeglichen Müll aus dem View filtern, was aber bei meiner Abfrage via Programm nicht so scheint.

Es wird immernoch der Fehler "Not a valid Month" angezeigt. So langsam hab ich Oracle gefressen. Wenn doch laut ISDATE() kein falscher Monat mehr im View vorhanden sein KANN, dann sollte die vor einigen Beiträgen erwähnte SQL Abfrage doch funktionieren?!

So langsam scheine ich deine Ex-Schwiegermutti zu kennen. *gg*

Gruß, Jan

PS: Gut,... Oracle kann nix dafür das da so besch.... Daten in den Tabellen stehen, aber es könnte mir wenigstens ein kleines bischen helfen die wieder loszuwerden.
Bitte warten ..
Mitglied: Biber
15.12.2009 um 19:35 Uhr
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..

01.
SELECT * from PALETTEN.ZSD_PALETTEN_VIEW 
02.
Where isdate(wadat_ist) = 'true' 
03.
And ( Substr(wadat_ist, 5, 2) < '01'  or Substr( wadat_ist, 5, 2) >'12' )
oder so ähnlich

Grüße
Biber
Bitte warten ..
Mitglied: JanKorte
15.12.2009 um 21:07 Uhr
Moin Biber,

das alles klingt sehr sinnvoll, ist es sicherlich auch. Bin allerdings nicht mehr in der Firma und werde deswegen morgen weitergucken. Hab für heute erstmal die Schnauze voll.
Ich danke dir aber schonmal für die geleistete Hilfe und wünsche dir einen erholsamen Abend.

Bis Morgen mit Response zu der Select Erweiterung

Gruß, Jan
Bitte warten ..
Mitglied: JanKorte
08.05.2010 um 17:44 Uhr
Update zum Abschluss: Die Funktion IsDate hat funktioniert. Mein Programm läuft jetzt einwandfrei.

Vielen Dank Biber!!
Bitte warten ..
Mitglied: Biber
10.05.2010 um 07:30 Uhr
Moin Jan Korte,

danke für die Rückmeldung und Gratulation zur erfolgreichen Lösung.

Interessehalber: war denn noch eine Änderung/Verfeinerung der IsDate()-Funktion nötig?

Grüße
Biber
Bitte warten ..
Mitglied: JanKorte
13.05.2010 um 17:22 Uhr
Moinsen,

die IsDate()-Funktion hat so gereicht wie angegeben. Ich habe nur hier und da in der Abfrage noch ein paar Sachen ausgeschlossen, welche allerdings nichts mit dem Datum zu tun hatten.

Vielen Dank für deine Hilfe. Ich revanchier mich gern mal sobald ich die Chance dazu bekomme ^^

Gruß, Jan
Bitte warten ..
Ähnliche Inhalte
Datenbanken
Fehler bei der Oracle DB-Sicherung
Frage von dbox3Datenbanken1 Kommentar

Hallo liebe Gemeinde, ich habe auf meinem Server 2008r2 eine Sicherung der Oracle-DB eingerichtet, die längere Zeit problemlos lief, ...

Datenbanken
ORACLE DB Abfrage
Frage von MarabuntaDatenbanken5 Kommentare

Hallo, ich habe folgende Tabelle: Jetzt brauche ich eine Abfrage, um das vorletzte Datum auszugeben. Vorher: Zwischenstand: In den ...

Datenbanken
IF Abfrage im SELECT Oracle SQL
gelöst Frage von 94451Datenbanken2 Kommentare

Hallo , ist es möglich im SELECT eine IF-Abfrage machen (bin auch offen für eine andere Lösung). >SELECT ID, ...

Microsoft Office
Abfrage durch vba von Oracle-DB, Fehlermeldung
Frage von famsprengeMicrosoft Office

Hallo zusammen, ich versuche mit Excel-vba eine Abfrage von einer Oracle-Datenbank durchzuführen. Der Code läuft durch bis zum Öffnen ...

Neue Wissensbeiträge
Batch & Shell

Open Object Rexx: Eine mittlerweile fast vergessene Skriptsprache aus dem Mainframebereich

Information von Penny.Cilin vor 19 StundenBatch & Shell8 Kommentare

Ich kann mich noch sehr gut an diese Skriptsprache erinnern und nutze diese auch heute ab und an noch. ...

Humor (lol)

"gimme gimme gimme": Automatischer Test stolpert über Easter Egg im man-Tool

Information von Penny.Cilin vor 21 StundenHumor (lol)6 Kommentare

Interessant, was man so alles als Easter Egg implementiert. Ist schon wieder Ostern? "gimme gimme gimme": Automatischer Test stolpert ...

MikroTik RouterOS

Mikrotik - Lets Encrypt Zertifikate mit MetaROUTER Instanz auf dem Router erzeugen

Anleitung von colinardo vor 1 TagMikroTik RouterOS8 Kommentare

Einleitung Folgende Anleitung ist aus der Lage heraus entstanden das ein Kunde auf seinem Mikrotik sein Hotspot Captive Portal ...

Sicherheit

Sicherheitslücke in HP-Druckern - Firmware-Updates stehen bereit

Information von BassFishFox vor 1 TagSicherheit1 Kommentar

Ein weiterer Grund, dass Drucker keinerlei Verbindung nach "auswaerts" haben sollen. Unter Verwendung spezieller Malware können Angreifer aus der ...

Heiß diskutierte Inhalte
Windows Server
RDP macht Server schneller???
Frage von JaniDJWindows Server17 Kommentare

Hallo Community, wir betrieben seit geraumer Zeit diverse virtuelle Maschinen und Server mit Windows Server 2012. Leider haben wir ...

Windows 10
Bitlocker nach Verschlüsselung nicht mehr aufrufbar!
gelöst Frage von alexlazaWindows 1013 Kommentare

Hallo, ich besitze ein HP ZBook 17 G4 mit einem Windows 10 Pro Betriebssystem. Bei diesem Problem handelt sich, ...

Off Topic
Fachkräftemangel in Deutschland? - Talentschmiede schreibt alle 2 Tage die gleichen Stellen aus
Frage von Penny.CilinOff Topic12 Kommentare

Hallo, haben wir in Deutschland Fachkräftemangel? Die Talentschmiede schreibt gefühlt alle zwei Tage dieselben Stellen aus. Und das schon ...

Windows Server
Sichere Remote Desktop Verbindung wie?
gelöst Frage von nuss33Windows Server11 Kommentare

Hallo zusammen, eins vorweg: Ich besitze einen privaten Windows Server 2008 R2 zu Hause im Netzwerk er wird nicht ...