Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL ABfrage von Datum Zeit bis Datum Zeit über mehrere Tage (https://www.delphipraxis.net/67501-sql-abfrage-von-datum-zeit-bis-datum-zeit-ueber-mehrere-tage.html)

nachtstreuner 15. Apr 2006 16:44

Datenbank: Absolute Database • Version: 5.04 • Zugriff über: ABS.Query Komponente

SQL ABfrage von Datum Zeit bis Datum Zeit über mehrere Tage
 
Hallo !

Ich möchte mit einer SQL-Abfrage alle Datensätze haben, die zwischen vonDatum vonZeit und bisDatum bisZeit liegen.

Im Formular gibt es 6 Eingabemöglichkeiten:

vonDatum : DateTimePicker
bisDatum : dateTimePicker

vonDatumVonZeit : maskEdit liefert einen String
vonDatumBisZeit : maskEdit ....

bisDatumVonZeit : maskEdit ....
bisDatumBisZeit : maskEdit ....

in der Datenbank habe ich ein Feld Datum Typ Date und ein Feld ZEIT typ String.

Wie müsste der SQL Befehl aussehen, damit ich alle Datensätze erhalte, die zwischen dem

03.03.2006 / 02:00:00 Uhr und dem
04.03.2006 / 03:00:00 Uhr liegen ?

Ich habe es folgendermassen probiert :
Delphi-Quellcode:
SQL_TEXT := SQL_TEXT +
       ' Where (DATUM >= :voDatum and Zeit >=:vonZeit) '+
       'and (DATUM <= :biDatum and ZEIT <=:bisZEIT)';
       cxMemo.Lines.Add(SQL_TEXT);
       ABSQuery.SQL.Add(SQL_TEXT);
       with ABSQuery.Params do begin
            ParamValues['voDatum']  :=DateToStr(vonDatum.Date);
            ParamValues['vonZeit']  :=edVonDatvonZeit.Text;
            //ParamValues['vonLeer']  :='23:59:59';
            ParamValues['biDatum']  :=DateToStr(bisDatum.Date);
            //ParamValues['bisLeer']  :='00:00:00';
            ParamValues['bisZEIT']  :=edbisDatbisZeit.Text;
       end;
Hier erhalte ich aber nur Datensätze, die vom 03.04.2006 ab 02:00:00 bis 03:00:00 liegen.
Was stimmt hier nicht ?

mkinzler 15. Apr 2006 17:24

Re: SQL ABfrage von Datum Zeit bis Datum Zeit über mehrere
 
Also es bei deiner Konstellation nicht so einfach möglich, das erwünscht Egebnis zu erzielen. Wäre Datum und Unrzeit in einem datetime-Fels würde eine einfache between-Bedingung ausreichen:
SQL-Code:
...Where (DATUM between :voDatum and :bisDatum )
So mußt du aber deine Abfrage in 3 Schritten ausführen:
1.) Termine am Starttag von StartZeit bis 24:00
2.) Termine zwischen vondatum +1 bis bisDatum -1
2.) Termine am Endtag von 0:00 - EndZeit.

SQL-Code:
...Where ( DATUM = :vonDatum AND ZEIT >= :vonZeit) union ...
  (DATUM between :voDatum2 and :bisDatum2 ) union ...
  ( DATUM = :bisDatum AND ZEIT <= :bisZeit)

nachtstreuner 15. Apr 2006 17:52

Re: SQL ABfrage von Datum Zeit bis Datum Zeit über mehrere
 
Vielen Dank für die rasche Antwort, leider habe ich von SQL noch nicht allzu viel am Hut.
Deswegen meine Frage was genau bewirkt union ?

fkerber 15. Apr 2006 17:55

Re: SQL ABfrage von Datum Zeit bis Datum Zeit über mehrere
 
Hi!

Vielleicht hilft dir dann das hier weiter:
http://www.aspheute.com/artikel/20011015.htm


Ciao Frederic

mkinzler 15. Apr 2006 17:55

Re: SQL ABfrage von Datum Zeit bis Datum Zeit über mehrere
 
union vereinigt mehrere Abfragen zu einer Ergebnismenge:

z.B.

Tabelle1
Name Vorname
Müller Hans
Maier Peter

Tabelle2
Name Vorname
Schmitt Susi

SQL-Code:
Select name, vorname from tabelle1 union select name, vorname from tabelle2;
Ergebnis:
Name Vorname
Müller Hans
Maier Peter
Schmitt Susi

marabu 15. Apr 2006 18:31

Re: SQL ABfrage von Datum Zeit bis Datum Zeit über mehrere
 
Hallo.

Auf Intervallbildung und Mengenvereinigung kann vielleicht verzichtet werden, wenn man ein etwas komplexeres SQL-Statement in Kauf nimmt. Immerhin kennt ABS laut Handbuch die Funktionen TODATE(), TOSTRING() und CAST(). Aber um die ursprüngliche Frage nochmal aufzugreifen:

Zitat:

Zitat von nachtstreuner
Was stimmt hier nicht ?

Der Feldtyp für die Zeitangabe ist einfach falsch gewählt - ich hätte wahrscheinlich DATETIME genommen.

Freundliche Grüße vom marabu

nachtstreuner 15. Apr 2006 19:12

Re: SQL ABfrage von Datum Zeit bis Datum Zeit über mehrere
 
Vielen Dank mKinzler und fKerber,

Habe es nun mit union versucht, hier der Code :

Delphi-Quellcode:
SQL_TEXT := SQL_TEXT +
       ' Where (DATUM = :voDatum and Zeit >= :vonZeit) union'+
       ' (DATUM between :voDATUM2 and :biDATUM2) union '+
       'and (DATUM = :biDatum and ZEIT <= :bisZEIT)';
       cxMemo.Lines.Add(SQL_TEXT);
       ABSQuery.SQL.Add(SQL_TEXT);
       with ABSQuery.Params do begin
            ParamValues['voDatum']  :=DateToStr(vonDatum.Date);
            ParamValues['vonZeit']  :=edVonDatvonZeit.Text;
            ParamValues['voDatum2'] :=DateToStr(vonDatum.Date +1);
            ParamValues['biDatum']  :=DateToStr(bisDatum.Date);
            ParamValues['biDatum2']  :=DateToStr(bisDatum.Date -1);
            ParamValues['bisZEIT']  :=edbisDatbisZeit.Text;
       end;
Hier erhalte ich allerdings folgende Fehlermeldung ?

Im Projekt .... ist eine Exception der Klasse EABSException aufgetreten.
Meldung : "Token 'Select' expected , but 'Datum' at line 1, column 79 - Native Error 30194 !

Hängt das etwa mit dem WOrt Datum zusammen, vielleicht ein reserviertes Wort ?

mkinzler 15. Apr 2006 19:19

Re: SQL ABfrage von Datum Zeit bis Datum Zeit über mehrere
 
Das UNION vereinigt meherere SQL-Statements deshalb mußt du nach dem Union das 'Select ...where ' wiederholen.( siehe auch allg. Bsp von mir oben)

nachtstreuner 15. Apr 2006 19:44

Re: SQL ABfrage von Datum Zeit bis Datum Zeit über mehrere
 
Hallo zusammen und besten Dank an alle hier, es hat geklappt !!

Nach dem letzten Hinweis von mKinzler
Zitat:

Das UNION vereinigt meherere SQL-Statements deshalb mußt du nach dem Union das 'Select ...where ' wiederholen.( siehe auch allg. Bsp von mir oben)
hat es nun funktioniert. :drunken:

Hier das Ergebnis des geänderten Codesnippet für alle die sowas ähnliches suchen
Delphi-Quellcode:
SQL_TEXT :=
       'SELECT * from nLeerscan ' +
       ' Where (DATUM = :voDatum and Zeit >= :vonZeit) union'+
       ' (Select * from nLeerscan where DATUM between :voDATUM2 and :biDATUM2) union '+
       ' (Select * from nLeerscan where DATUM = :biDatum and '+
       'ZEIT <= :bisZEIT) order by Datum , Zeit';
       cxMemo.Lines.Add(SQL_TEXT);
       ABSQuery.SQL.Add(SQL_TEXT);
       showmessage(absQuery.sql.text);
       with ABSQuery.Params do begin
            ParamValues['voDatum']  :=DateToStr(vonDatum.Date);
            ParamValues['vonZeit']  :=edVonDatvonZeit.Text;
            ParamValues['voDatum2'] :=DateToStr(vonDatum.Date +1);
            ParamValues['biDatum']  :=DateToStr(bisDatum.Date);
            ParamValues['biDatum2']  :=DateToStr(bisDatum.Date -1);
            ParamValues['bisZEIT']  :=edbisDatbisZeit.Text;
       end;
Mein Problem ist hiermit gelöst, habt nochmals Dank! PS: Als Neuling vielleicht noch eine Frage, muß ich den Thread hier nun schließen ? Oder was muß ich jetzt tun, damit dieser thread geschlossen wird ?

fkerber 15. Apr 2006 20:20

Re: SQL ABfrage von Datum Zeit bis Datum Zeit über mehrere
 
Hi!

[quote="nachtstreuner"]Mein Problem ist hiermit gelöst, habt nochmals Dank! PS: Als Neuling vielleicht noch eine Frage, muß ich den Thread hier nun schließen ? Oder was muß ich jetzt tun, damit dieser thread geschlossen wird ? quote]

Es bleibt einfach alles so wie es ist. So können auch andere, die noch ne Frage dazu haben, etwas hier in den Thread posten.
Nur, wenn du eine Frage als "offen" markiert hast, dann solltest du diese Markierung nach Beantwortung der Frage entfernen.

Ciao Frederic


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:48 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