AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi SQL mit Union und Unterabfragen liefert falsches Ergebnis
Thema durchsuchen
Ansicht
Themen-Optionen

SQL mit Union und Unterabfragen liefert falsches Ergebnis

Ein Thema von nachtstreuner60 · begonnen am 26. Jan 2007 · letzter Beitrag vom 29. Jan 2007
Antwort Antwort
Seite 1 von 3  1 23      
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
Benutzerbild von x000x
x000x

Registriert seit: 21. Jan 2004
Ort: Bei Hamburg
308 Beiträge
 
Delphi XE2 Professional
 
#2

Re: SQL mit Union und Unterabfragen liefert falsches Ergebni

  Alt 26. Jan 2007, 23:36
Moin moin,

Zitat von nachtstreuner60:
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'
Das liegt wohl daran, dass das erste Statement alle Datensätze mit Status E liefert, egal welcher Zeitraum.
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
Peter
-= Gruss Peter =-
-= alias x000x =-
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#3

Re: SQL mit Union und Unterabfragen liefert falsches Ergebni

  Alt 27. Jan 2007, 07:44
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:
Select * From Tabelle Where DatumsFeld Between '24.01.2007 14:00and '25.01.2007 12:00' 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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
nachtstreuner60

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

Re: SQL mit Union und Unterabfragen liefert falsches Ergebni

  Alt 27. Jan 2007, 08:56
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.
Miniaturansicht angehängter Grafiken
abfrage_148.jpg   abfr_erst_137.jpg  
  Mit Zitat antworten Zitat
nachtstreuner60

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

Re: SQL mit Union und Unterabfragen liefert falsches Ergebni

  Alt 27. Jan 2007, 09:00
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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

Re: SQL mit Union und Unterabfragen liefert falsches Ergebni

  Alt 27. Jan 2007, 09:58
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:
SELECT *
  FROM bestell
  WHERE status = 'E
    AND datum + zeit BETWEEN '2007-01-24 02:00:00AND '2007-01-25 14:00:00'
Grüße vom marabu
  Mit Zitat antworten Zitat
nachtstreuner60

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

Re: SQL mit Union und Unterabfragen liefert falsches Ergebni

  Alt 27. Jan 2007, 10:15
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
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: SQL mit Union und Unterabfragen liefert falsches Ergebni

  Alt 27. Jan 2007, 13:27
Nimm Parameter, dann entfällt die Umwandlung auf jeden Fall. Sollte aber auch so unnötig sein.
Markus Kinzler
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#9

Re: SQL mit Union und Unterabfragen liefert falsches Ergebni

  Alt 27. Jan 2007, 13:59
Hallo Nachtstreuner,

Zitat von nachtstreuner60:
das Datum liegt im folgenden Format vor : 24.01.2007
ganz sicher nicht - es wird bei dir aufgrund der Systemeinstellungen so angezeigt. Gespeichert ist es in einem Binärformat und damit meine und deine SQL-Statements (fast) weltweit funktionieren, werden Datum- und Zeit-Literale im Norm-Format eingegeben. Merkst du aber auch, wenn du es einfach ausprobierst. Ich bin mit meinem Code bewusst nahe an den Vorgaben geblieben, aber für den produktiven Einsatz kommst du um die von Markus erwähnten Parameter nicht herum.

Freundliche Grüße
  Mit Zitat antworten Zitat
nachtstreuner60

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

Re: SQL mit Union und Unterabfragen liefert falsches Ergebni

  Alt 28. Jan 2007, 11:25
.... folgende Lösung funktioniert:

Delphi-Quellcode:
datSQL := ' and DATUM + ZEIT between '+
              QuotedStr(Datetostr(vonDatum.Date)+ ' '+ edvonDATvonZEIT.Text)+ ' and '+
              QuotedStr(DateToStr(bisDatum.date)+ ' '+ edBisDATbisZeit.Text)+
              ' order by DATUM, ZEIT';
...mit Parametern habe ich es noch nicht probiert. Muss die Variable im Parameterverwendet wird, erst
initialisiert werden.

z.B. : var voDatum

Params.ParambyName('voDatum').asstring := DattoStr(vonDatum.Date); habt erstmal dank, für die obigen Tips. tolles Forum !

mit freundlichen Grüßen

[edit=Jelly]Delphi Tags angepast, Mfg, Jelly[/edit]
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:51 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz