AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Datenbankabfrage auf Ereignisse zwischen Datum 1 und Datum 2
Thema durchsuchen
Ansicht
Themen-Optionen

Datenbankabfrage auf Ereignisse zwischen Datum 1 und Datum 2

Ein Thema von Jens Hartmann · begonnen am 9. Jan 2010 · letzter Beitrag vom 30. Jan 2010
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#1

Datenbankabfrage auf Ereignisse zwischen Datum 1 und Datum 2

  Alt 9. Jan 2010, 17:19
Datenbank: Firebird • Version: 2.1 • Zugriff über: ZEOS
Hallo zusammen,

ich habe mal wieder ein Problem. Ich habe zwar hier im Forum gesucht, aber leider nichts passendes gefunden. Ich möchte aus einer Datenbank nur die Datensätze abfragen, die zwischen Datum 1 und Datum 2 liegen. es gibt dazu auch Beiträge hier, aber irgendwie klappt das bei mir nicht. Wenn ich das richtig verstanden habe, müsste der SQL Befehl doch folgendermaßen aussehen.

Delphi-Quellcode:
//Aufruf der Procedure ReaddataDateTime
    case QryVorgabe.FieldByName('ZENTRALENTYP').AsInteger of
      0..2:
        begin
          ReadDataDateTime(DateTimePicker1.Date, DateTimePicker2.DateTime, 'MB100');
          HTMLErzeugenMBSerie;
        end;
//Procedure ReadDataDateTime
procedure THTMLExportForm.ReadDataDateTime(Date1,Date2 : TDate; Table : String);
begin
  QryHTML.SQL.Text := 'SELECT * FROM '+Table+' WHERE DATUM BETWEEN '
                       +DateToStr(Date1)+' AND '+DateToStr(Date2);
  QryHTML.Open;
end;
Leider kommt hier aber der folgende SQL Fehler

Vieleicht kann mir ja jemand sagen woran das liegt.


Gruß Jens
Miniaturansicht angehängter Grafiken
aufzeichnen_178.gif  
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

Re: Datenbankabfrage auf Ereignisse zwischen Datum 1 und Dat

  Alt 9. Jan 2010, 17:25
Es fehlen die Anfügrungstriche um die Datumswerte. Aber ich würde Parameter verwenden
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#3

Re: Datenbankabfrage auf Ereignisse zwischen Datum 1 und Dat

  Alt 9. Jan 2010, 17:39
Danke Markus,

habe es jetzt so gelößt...
Delphi-Quellcode:
procedure THTMLExportForm.ReadDataDateTime(Date1,Date2 : TDate; Table : String);
begin
  QryHTML.SQL.Text := 'SELECT * FROM '+Table+' WHERE DATUM >= :ANFANG and DATUM <= :ENDE';
  QryHTML.ParamByName('ANFANG').AsDate := Date1;
  QryHTML.ParamByName('ENDE').AsDate := Date2;
  QryHTML.Open;
Gruß Jens
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#4

Re: Datenbankabfrage auf Ereignisse zwischen Datum 1 und Dat

  Alt 9. Jan 2010, 17:47
Hallo Jens,

BETWEEN kannst du auch bei dieser Variante verwenden. Ich weiß aber nicht, ob eine der beiden besser (d.h. schneller) ist als die andere. Logisch sind sie sowieso identisch. Jürgen
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#5

Re: Datenbankabfrage auf Ereignisse zwischen Datum 1 und Dat

  Alt 10. Jan 2010, 09:30
Man muss bei dieser Filterung auf einen Datumbereich etwas acht geben.
Manche Datenbanken kennen nur ein DateTime-Feld; also Datum und Uhrzeit zusammen.
Wenn die Abfrage alle Datensätze zwischen dem 1.1.2010 und dem 10.1.2010 liefern soll,
dann würde aber ein Datensatz mit dem Wert "10.1.2010 08:30:00" unter den Tisch fallen.

Daher muss die Abfrage und die Procedure leicht verändert werden.
Das Endedatum wird nicht mit <= sondern nur noch mit < verglichen.
Im Gegenzug wird der Parameter für das Endedatum um einen Tag in die Zukunft versetzt.
Delphi-Quellcode:
function NurDatumsAnteil(dt:TDateTime):TDate;
begin
  result := Int(dt);
end;

procedure THTMLExportForm.OpenTableDateRange(DateBegin,DateEnd : TDate; const Tablename : String);
begin
  QryHTML.SQL.Text := 'SELECT * FROM '+Tablename+' WHERE DATUM >= :ANFANG and DATUM < :ENDE';
  QryHTML.ParamByName('ANFANG').AsDate := NurDatumsAnteil(DateBegin);
  QryHTML.ParamByName('ENDE').AsDate := NurDatumsAnteil(DateEnd) + 1.0;
  QryHTML.Open;
Ich habe zusätzlich die Funktion NurDatumsAnteil() eingesetzt.
Manche werden sich vielleicht fragen: warum schreibt man dann nicht gleich Int(Date1) und Int(Date2)?
Durch die Verwendung dieser scheinbar überflüssigen Funktion habe ich meine Absicht klargemacht,
was der Code hier tun soll.
Man braucht so keine Kommentare um zu erklären was passiert.

Ich habe auch den Namen der Prozedur und dessen Parameternamen geändert, damit die Verwendung der Prozedur noch klarer wird.
fork me on Github
  Mit Zitat antworten Zitat
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#6

Re: Datenbankabfrage auf Ereignisse zwischen Datum 1 und Dat

  Alt 30. Jan 2010, 16:51
Hallo zusammen,

habe mal noch ne Frage zum eingrenzen des Datumsbereichs in Verbindung mit der Uhrzeit Irgendwie fehlt mir da gerade die Logik. Ich möchte z.B. folgende Eingrenzung realisieren.

von Datum / Uhrzeit
bis Datum / Uhrzeit

in Zahlen

21.01.2010 / 17:00:00
23.01.2010 / 06:00:00

wenn ich diese Abfrage wie folgt realisiere, dann werden allerdings an allen Tagen die Zeiten die nicht im Zeitbereich liegen logischer Weise nicht gefunden. Wie aber bekomme ich das hin, das er am 22.01.2010 logischer Weise alle Zeiten von 00:00:00 bis 23:59:59 finden wird und nur am ersten und letzten Suchtag die Grenze setzt.

Delphi-Quellcode:
//Erste Variante die nicht geht
     QryDatumsbereich.SQL.Text := 'SELECT * FROM '+Table+
       ' WHERE DATUM >= :ANFANG and DATUM <= :ENDE and UHRZEIT >= :ZANFANG and UHRZEIT <=:ZENDE';
      QryDatumsbereich.ParamByName('ANFANG').AsDate := Date1;
      QryDatumsbereich.ParamByName('ENDE').AsDate := Date2;
      QryDatumsbereich.ParamByName('ZANFANG').AsTime := Time1;
      QryDatumsbereich.ParamByName('ZENDE').AsTime := Time2;
      QryDatumsbereich.Open;
//Zweite Variante die nicht geht
      QryDatumsbereich.SQL.Text := 'SELECT * FROM '+Table+
        ' WHERE (DATUM >= :ANFANG and UHRZEIT >= :ZANFANG) and (DATUM <= :ENDE and UHRZEIT <=:ZENDE)';
      QryDatumsbereich.ParamByName('ANFANG').AsDate := Date1;
      QryDatumsbereich.ParamByName('ENDE').AsDate := Date2;
      QryDatumsbereich.ParamByName('ZANFANG').AsTime := Time1;
      QryDatumsbereich.ParamByName('ZENDE').AsTime := Time2;
      QryDatumsbereich.Open;


Irgend jemand eine Idee wie das gehen kann.

Gruß Jens
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

Re: Datenbankabfrage auf Ereignisse zwischen Datum 1 und Dat

  Alt 30. Jan 2010, 17:03
SQL-Code:
SELECT
    *
FROM
    <Tabelle>
WHERE
    (DATUM = :ANFANG and UHRZEIT >= :ZANFANG) or
    (Datum >= DateAdd( day, 1, :ANFANG) and Datum <= (DateAdd( day, -1, :ENDE)) or
    (DATUM = :ENDE and UHRZEIT <= :ZENDE);
Markus Kinzler
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

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

Re: Datenbankabfrage auf Ereignisse zwischen Datum 1 und Dat

  Alt 30. Jan 2010, 17:11
Wenn Du deine Tabelle (zusätzlich) mit einem kombinierten DateTime-Feld versiehst, stellt sich die Frage nicht, denn dann kannst Du einfach mit 'Between' arbeiten:
select * from Tabelle where DatumZeitFeld Between :Anfang and :Ende
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#9

Re: Datenbankabfrage auf Ereignisse zwischen Datum 1 und Dat

  Alt 30. Jan 2010, 17:34
Ich habe eine Spalte TimeStamp, allerdings habe ich das Problem, das dieses ja vom Systemerstellt wird. Die Daten die ich von meiner Hardware geliefert bekomme, sind allerdings in Datum Uhrzeit getrennt, und könnten theoretisch von der Systemzeit abweichen.
Das sollte zwar eigendlich nicht der Fall sein, kann aber passieren. Und ich sehe ein Problem im aktuell halten der Uhrzeit der Hardware. Diese machen wir eigenlich immer, wenn wir wegen einer Störung zum Kunden kommen. Allerdings kann das auch mal 1 Jahr lang nicht sein. Und lasse ich den Kunden jetzt nach Ereignissen suchen, die allerdings über den TimeStamp gehen, wird er sich wundern, warum in der Spalte Uhrzeit eventuell auch Daten auftauchen, die zumindest der Suchfunktion nicht vorhanden sein dürften. Der Kunde selber kann ja nicht sehen, das ich über den TimeStamp gesucht habe. Er sieht ja in seiner Anzeige nur das Datum, welches die Hardware geliefert hat.

Gruß Jens
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

Re: Datenbankabfrage auf Ereignisse zwischen Datum 1 und Dat

  Alt 30. Jan 2010, 17:35
Du könntest den Wert aber aus den beiden Werten zusammensetzen
Markus Kinzler
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 18:21 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