![]() |
Datenbank: Firebird • Version: 1.5 • Zugriff über: Zeos SQL Query
SQL mit Union und Unterabfragen liefert falsches Ergebnis
Hallo SQL-Experten,
benötige mal wieder Tips zu folgender Abfrage:
Delphi-Quellcode:
Folgender SQL-Befehl bekomme ich angezeigt:
// ist vonDatumbisZeit gefüllt, und bisDatum unterschiedlich zu von Datum
// und bisDatbisZeit gefüllt, dann //*********** Zeitraum über mehrere Tage hinweg ******************************* if (length(trim(edvonDatvonZeit.Text)) = 8) and (length(trim(edVonDatbisZeit.Text)) <> 8) then begin if (length(trim(edbisDatbisZeit.Text)) = 8) and (length(trim(edBisDatvonZeit.Text)) <> 8) then begin datSQL := ' union select * from BESTELL where (DATUM = '+ Quotedstr(DateToStr(vonDatum.Date)) + ' and ZEIT >= '+ Quotedstr(edVonDatvonZeit.Text)+') union '+ 'Select * from BESTELL where (DATUM between '+ Quotedstr(DateToStr(vonDATUM.Date + 1))+ ' and ' + QuotedStr(DateToStr(bisDatum.Date -1))+')'+ ' union Select * from BESTELL where (DATUM = '+ QuotedStr(DateToStr(bisDatum.Date))+' and ZEIT <= '+ QuotedStr(edBisDatBisZEIT.text)+') order by 4, 5'; end; end; // Zeige den SQL-BEFEHL with dMODUL do begin zQueryKanban.SQL.Clear; zQueryKANBAN.SQL.Text := dSQL+datSQL; reditSQL.Clear; rEditSQL.Lines.Add(zQueryKANBAN.SQL.Text); showmessage(zqueryKANBAN.SQL.Text); zQueryKANBAN.Open; end; SELECT * from BESTELL where STATUS = 'E' // dieser Befehl steht in dSQL union select * from BESTELL where (DATUM = '24.01.2007' and ZEIT >= '02:00:00') union Select * from BESTELL where (DATUM between '25.01.2007' and '24.01.2007') union Select * from BESTELL where (DATUM = '25.01.2007' and ZEIT <= '14:00:00') order by 4, 5 Als Ergebnis bekomme ich tatsächlich ab 24.01.07 02:00:00 Uhr alle Datensätze, allerdings werden mir am 25.01.07 auch Datensätze angezeigt, die nach 14:00 Uhr liegen. Der zweite Fehler ist folgender ,ich bekomme nicht nur STATUS ='E' angezeigt, sondern auch Status ='D' Was ist hier schief gelaufen. Ich teste und lese schon fast 8 Std und komme zu keinem richtigen Ergebnis. Wenn ich allerdings den SQL-Befehl vor dem ersten union weglasse,also Select * from Bestell where STATUS ='E', so erhalte ich die richtigen Datensätze für den abgefragten Zeitraum. Ich bedanke mich jetzt schon, für alle Tips Gruß Nachtstreuner |
Re: SQL mit Union und Unterabfragen liefert falsches Ergebni
Moin moin,
Zitat:
Und der zweite "Fehler", dass bei dem 2., 3. und 4. Statement keine Einschränkung für den Status mit angegeben ist. Wenn du wirklich nur Datensätze mit Status E aus einem Zeitraum haben willst, sollte folgendes funktionieren:
Code:
SELECT *
from BESTELL where STATUS = 'E' and ((DATUM = '24.01.2007' and Zeit >= '02:00:00') or (DATUM = '25.01.2007' and Zeit <= '14:00:00')) order by 4, 5 |
Re: SQL mit Union und Unterabfragen liefert falsches Ergebni
Bei Daten, die chronologisch gespeichert werden sollen, empfiehlt es sich, den Zeitpunkt als DateTime abzulegen (Also Datum mit Uhrzeit). Dann vereinfachen sich solche Abfragen zu:
SQL-Code:
bzw. dem pendant im jeweiligen SQL-Dialekt (o.g. Query ist z.B. 'MS SQL mit deutschen Datumsangaben'. Natürlich ist es dann nicht so einfach (aber auch nicht sonderlich schwer), über das Datum gruppierte Auswertungen zu erstellen.
Select * From Tabelle Where DatumsFeld Between '24.01.2007 14:00' and '25.01.2007 12:00'
|
Re: SQL mit Union und Unterabfragen liefert falsches Ergebni
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo Peter,
vielen Dank, für Deine schnelle nächtliche Aktion. Dein Beispiel Code mag so funktionieren, aber nur dann, wenn es sich um einen Zeitraum von 1einem auf den nächsten Tag handelt. Aber wie sieht´s aus wenn das Anfagsdatum der 22. und das Enddatum der 25. eines Monats ist, die Anfangszeit 14:00 Uhr am 22. liegt, die Endzeit am 25. um 01:00 Uhr liegt ? Ich habe mal zu meinem Problem zei Screenshot´s hinzugefügt. Dort sieht man auch die Problemmatik. |
Re: SQL mit Union und Unterabfragen liefert falsches Ergebni
Hallo alzaimar,
auch Dir sei erstmal gedankt. Diese Form der Abfrage ist freilich einfacher, aber Datum und Zeit sind in einer Firebird DB in getrennten Feldern abgelegt. Datum = Date Format Zeit = String-Format Ich kann das auch nicht so einfach ändern. Aber grundsätzlich sollte wie in meinem 2. Beitrag in den Bildern ersichtlich, diese Abfrage mittels Union auch funktionieren, wie gesagt ohne das erste Statement Select * fro BESTELL where Status ='E' funktionierts ja. mfg nachtstreuner |
Re: SQL mit Union und Unterabfragen liefert falsches Ergebni
Hallo Nachtstreuner,
wenn es wirklich nur um die Ermittlung von Datensätzen geht, welche in einen bestimmten Zeitraum fallen und einen bestimmten Status aufweisen (was Peter korrekt erkannt hat), dann kannst du auch bei getrennten Feldern für Datum und Uhrzeit eine Intervallprüfung einsetzen (wie alzaimar gezeigt hat):
SQL-Code:
Grüße vom marabu
SELECT *
FROM bestell WHERE status = 'E' AND datum + zeit BETWEEN '2007-01-24 02:00:00' AND '2007-01-25 14:00:00' |
Re: SQL mit Union und Unterabfragen liefert falsches Ergebni
Hallo marabu,
das Datum liegt im folgenden Format vor : 24.01.2007 muss ich das Datumsformat nun umwandeln in 2007-01-24 ? Oder geht das dann auch im o.a. Format ? Gruß Nachtstreuner |
Re: SQL mit Union und Unterabfragen liefert falsches Ergebni
Nimm Parameter, dann entfällt die Umwandlung auf jeden Fall. Sollte aber auch so unnötig sein.
|
Re: SQL mit Union und Unterabfragen liefert falsches Ergebni
Hallo Nachtstreuner,
Zitat:
Freundliche Grüße |
Re: SQL mit Union und Unterabfragen liefert falsches Ergebni
.... folgende Lösung funktioniert:
Delphi-Quellcode:
...mit Parametern habe ich es noch nicht probiert. Muss die Variable im Parameterverwendet wird, erst
datSQL := ' and DATUM + ZEIT between '+
QuotedStr(Datetostr(vonDatum.Date)+ ' '+ edvonDATvonZEIT.Text)+ ' and '+ QuotedStr(DateToStr(bisDatum.date)+ ' '+ edBisDATbisZeit.Text)+ ' order by DATUM, ZEIT'; initialisiert werden. z.B. : var voDatum
Delphi-Quellcode:
habt erstmal dank, für die obigen Tips. tolles Forum !
Params.ParambyName('voDatum').asstring := DattoStr(vonDatum.Date);
mit freundlichen Grüßen [edit=Jelly]Delphi Tags angepast, Mfg, Jelly[/edit] |
Re: SQL mit Union und Unterabfragen liefert falsches Ergebni
Besser so:
Delphi-Quellcode:
Params.ParambyName('voDatum').Value := vonDatum.Date;
|
Re: SQL mit Union und Unterabfragen liefert falsches Ergebni
Hallo,
du könntest den Benutzer die Datum- und Zeitwerte über DateTimePicker einstellen lassen:
Delphi-Quellcode:
Freundliche Grüße
begin
datSQL := '... and DATUM + ZEIT between :dtStart and dtEnd order by DATUM, ZEIT'; // ... Params.ParambyName('dtStart').AsDateTime := dtpVonDatum.Date + dtpVonZeit.Time; |
Re: SQL mit Union und Unterabfragen liefert falsches Ergebni
...Ihr seit ja schnell,
also ich habs erstmal so probiert !
Delphi-Quellcode:
:
datSQL := ' and DATUM + ZEIT between (:voDatvoZeit and :biDatbiZeit) order by DATUM Zeit';
with dModul do begin ZQueryKanban.ParamByName('voDatbiZeit').AsString := QuotedStr(Datetostr(vonDatum.Date)+ ' '+ edvonDATvonZEIT.Text); zQueryKanban.ParamByName('biDatbiZeit').AsString := QuotedStr(DateToStr(bisDatum.date)+ ' '+ edBisDATbisZeit.Text); end; : : weiter unten dann dies : :
Delphi-Quellcode:
with dMODUL do begin
zQueryKanban.SQL.Clear; zQueryKANBAN.SQL.Text := dSQL+datSQL; reditSQL.Clear; rEditSQL.Lines.Add(zQueryKANBAN.SQL.Text); showmessage(zqueryKANBAN.SQL.Text); zQueryKANBAN.Open; end; nun erhalte ich die Fehlermeldung, das 'Parameter : voDatbiZeit nicht gefunden' die Daten werden von einem DateTimePicker (Datum) und Editfeld (Zeit) geliefert. Siehe obigen Screenshot im Anhang mit freundlichen Grüßen [edit=Jelly] Delphi Tags angepasst, Mfg, Jelly[/edit] |
Re: SQL mit Union und Unterabfragen liefert falsches Ergebni
Die Parameter müßen nach dem QueryString gesetzt werden. Dann werden die Parameter automatisch erzeugt und können gesetzt werden.
BTW Verzichte besser auf den Umweg über den String. |
Re: SQL mit Union und Unterabfragen liefert falsches Ergebni
Hallo mKinzler,
habs nun abgeändert, bekomme aber trotzdem die Fehlermeldung.
Delphi-Quellcode:
Verzichte besser auf den Umweg über String ? Ich habe für die Eingabe ein DateTimePicker fürs Datum und ein Editfeld für die Zeitangabe(also String). Wie kann ich da auf den String verzichten ?
datSQL := ' and DATUM + ZEIT between (:voDatvoZeit and :biDatbiZeit) order by DATUM Zeit';
// Zeige den SQL-BEFEHL with dMODUL do begin zQueryKanban.SQL.Clear; zQueryKANBAN.SQL.Text := dSQL+datSQL; ZQueryKanban.ParamByName('voDatbiZeit').AsString := QuotedStr(Datetostr(vonDatum.Date)+ ' '+ edvonDATvonZEIT.Text); zQueryKanban.ParamByName('biDatbiZeit').AsString := QuotedStr(DateToStr(bisDatum.date)+ ' '+ edBisDATbisZeit.Text); reditSQL.Clear; rEditSQL.Lines.Add(zQueryKANBAN.SQL.Text); showmessage(zqueryKANBAN.SQL.Text); zQueryKANBAN.Open; end; Gruß Nachtstreuner |
Re: SQL mit Union und Unterabfragen liefert falsches Ergebni
Delphi-Quellcode:
datSQL := ' and DATUM + ZEIT between :voDatvoZeit and :biDatbiZeit order by DATUM Zeit';
// Zeige den SQL-BEFEHL with dMODUL do begin //zQueryKanban.SQL.Clear; ist Überflüssig zQueryKANBAN.SQL.Text := dSQL+datSQL; ZQueryKanban.ParamByName('voDatvoZeit').asDateTime := vonDatum.Date + StrToTime(edvonDATvonZEIT.Text); zQueryKanban.ParamByName('biDatbiZeit').AsDateTime := bisDatum.date + StrToTime(edBisDATbisZeit.Text); reditSQL.Clear; rEditSQL.Lines.Add(zQueryKANBAN.SQL.Text); showmessage(zqueryKANBAN.SQL.Text); zQueryKANBAN.Open; end; |
Re: SQL mit Union und Unterabfragen liefert falsches Ergebni
Liste der Anhänge anzeigen (Anzahl: 2)
Danke mKinzler,
funktioniert mit denParametern, allerdings mit einem Schönheitsfehler. Folgende Params wurden übergeben : siehe Anhang Abfr_erst Die Datensätze im roten Rechteck siehe Bild Anhang (Abfrage.jpg) hätten nicht angezeigt werden dürfen, da sie nach 15:45:00 Uhr liegen. und hier noch mal der Prog.Code:
Delphi-Quellcode:
fehlt in der Query irgendwo vielleicht eine Klammer ?
// ist vonDatumbisZeit und gefüllt, und bisDatum unterschiedlich zu von Datum
// und bisDatbisZeit gefüllt, dann //*********** Zeitraum über mehrere Tage hinweg ******************************* if (length(trim(edvonDatvonZeit.Text)) = 8) and (length(trim(edVonDatbisZeit.Text)) <> 8) then begin if (length(trim(edbisDatbisZeit.Text)) = 8) and (length(trim(edBisDatvonZeit.Text)) <> 8) then begin datSQL := ' and DATUM + ZEIT between :voDatvoZeit and :biDatbiZeit order by DATUM, Zeit'; end; end; // Zeige den SQL-BEFEHL with dMODUL do begin //zQueryKanban.SQL.Clear; zQueryKANBAN.SQL.Text := dSQL+datSQL; ZQueryKanban.ParamByName('voDatvoZeit').asDateTime := vonDatum.Date + StrToTime(edvonDATvonZEIT.Text); zQueryKanban.ParamByName('biDatbiZeit').AsDateTime := bisDatum.Date + StrToTime(edBisDATbisZeit.Text); reditSQL.Clear; rEditSQL.Lines.Add(zQueryKANBAN.SQL.Text); //showmessage(zqueryKANBAN.SQL.Text); zQueryKANBAN.Open; end; mfg nachtstreuner |
Re: SQL mit Union und Unterabfragen liefert falsches Ergebni
Wenn Datum und Zeit 2 Felder sind würde ich sie auch getrennt abfragen. Oder besser nur ein Feld in der Datenbank verwenden.
|
Re: SQL mit Union und Unterabfragen liefert falsches Ergebni
Hallo,
die Komponente TDateTimePicker enthält einen ![]() ![]() ![]() ![]() Gruß Hawkeye |
Re: SQL mit Union und Unterabfragen liefert falsches Ergebni
Hallo,
voDatbiZeit hast du im ParamByName stehen, voDatvoZeit in der SQL-Abfrage. Heiko |
Re: SQL mit Union und Unterabfragen liefert falsches Ergebni
**********************************************
SELECT * from BESTELL where STATUS = 'E' // dieser Befehl steht in dSQL union select * from BESTELL where (DATUM = '24.01.2007' and ZEIT >= '02:00:00') union Select * from BESTELL where (DATUM between '25.01.2007' and '24.01.2007') union Select * from BESTELL where (DATUM = '25.01.2007' and ZEIT <= '14:00:00') order by 4, 5 Als Ergebnis bekomme ich tatsächlich ab 24.01.07 02:00:00 Uhr alle Datensätze, allerdings werden mir am 25.01.07 auch Datensätze angezeigt, die nach 14:00 Uhr liegen. Der zweite Fehler ist folgender ,ich bekomme nicht nur STATUS ='E' angezeigt, sondern auch Status ='D' **************************************** Ich denke dein Fehler ist der, das du den Sinn einer Union-Abfrage nicht verstehst. Das , was du als Fehler interpretierst, kann durchaus die Ergebnismenge deiner obigen Sql-Abfrage sein. Schnapp dir ein Buch über Sql (oder Hilfetext im Internet) und schau einfach mal rein, was da über Union- Selects steht . |
Re: SQL mit Union und Unterabfragen liefert falsches Ergebni
Hallo zusammen,
vielen Dank an alle, die mir bei der Lösung dieses Problems geholfen haben. Ich habe es jetzt gelöst wie mKinzler beschrieben, das schien mir der beste und übersichtlichste Weg. Auf euch ist Verlass. Have a nice day. Bis zum nächstenmal. :bounce2: Gruß nachtstreuner |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:16 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz