Einzelnen Beitrag anzeigen

nachtstreuner60

Registriert seit: 15. Jan 2007
Ort: Eisenach
54 Beiträge
 
Delphi 7 Professional
 
#1

SQL mit Union und Unterabfragen liefert falsches Ergebnis

  Alt 26. Jan 2007, 22:59
Datenbank: Firebird • Version: 1.5 • Zugriff über: Zeos SQL Query
Hallo SQL-Experten,

benötige mal wieder Tips zu folgender Abfrage:

Delphi-Quellcode:
// 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;
Folgender SQL-Befehl bekomme ich angezeigt:
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
  Mit Zitat antworten Zitat