Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

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, 9116 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 ..
Neuester Wissensbeitrag
Microsoft

Lizenzwiederverkauf und seine Tücken

(5)

Erfahrungsbericht von DerWoWusste zum Thema Microsoft ...

Ähnliche Inhalte
Datenbanken
gelöst IF Abfrage im SELECT Oracle SQL (2)

Frage von Roadrunner777 zum Thema Datenbanken ...

Windows Server
gelöst BackupExec 2016 Fehler beim Backup von Windows 2016 (1)

Frage von Looser27 zum Thema Windows Server ...

Switche und Hubs
gelöst Trunk für 2xCisco Switch. Wo liegt der Fehler? (43)

Frage von JayyyH zum Thema Switche und Hubs ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (18)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Windows Netzwerk
Windows 10 RDP geht nicht (16)

Frage von Fiasko zum Thema Windows Netzwerk ...

Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...