Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Datumsabfrage mit Access DB über Jahreswechsel (https://www.delphipraxis.net/55617-datumsabfrage-mit-access-db-ueber-jahreswechsel.html)

mewlos26 24. Okt 2005 12:30

Datenbank: Access 2002 • Version: 10.0 • Zugriff über: ADO

Datumsabfrage mit Access DB über Jahreswechsel
 
Hallo,

ich möchte mit folgendem Source Code Zeiträume über ADO under Jet Engine abfragen. Zeiträume innerhalb eines Jahres z.B. 01.01.2005 bis 20.03.2005 sind kein Problem. Ein Zeitraum der über ein Jahr geht z.B. 10.11.2004 bis 10.03.2005 wird nicht angezeigt. Woran kann das liegen? Muss man das Datum noch mal aufsplitten in Tag, Monat, Jahr? Wenn ja wie muss ich den Source Code abwandeln?

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  StartDatum: String;
  EndeDatum : String;
begin
  DateSeparator := '/';            // ACHTUNG! hier wird eine globale Variable geändert
  StartDatum := FormatDateTime('#mm/dd/yyyy#', DateTimePicker1.Date);
  EndeDatum := FormatDateTime('#mm/dd/yyyy#', DateTimePicker2.Date);

  Query1.Close;
  Query1.SQL.Clear;
  Query1.SQL.Add('select * from datum001');

  // vereinfachte Version:
  Query1.SQL.Add(' where VonDatum <=' + StartDatum);
  Query1.SQL.Add('  and BisDatum >=' + EndeDatum );

  // Version mit “between”:
  //Query1.SQL.Add(' where (VonDatum between ' + StartDatum + ' and ' + EndeDatum + ')');
  //Query1.SQL.Add('  and (BisDatum between ' + StartDatum + ' and ' + EndeDatum + ')');
  Query1.Open;
end;

shmia 24. Okt 2005 13:04

Re: Datumsabfrage mit Access DB über Jahreswechsel
 
Das Datumsformat #mm/dd/yyyy# gilt nur für Access, nicht für die Jet-Engine.
Access baut auf die Jet-Engine auf, aber es gibt dennoch Unterschiede.
Also streich' diese Formatangabe aus deinem Gedächtnis.
Delphi-Quellcode:
  Query1.SQL.Text := 'select * from datum001'+
  // vereinfachte Version:
  ' where VonDatum >= : StartDatum and BisDatum <= :EndeDatum';
  Query1.Parameters.ParamValues['StartDatum'] := DateTimePicker1.Date;
  Query1.Parameters.ParamValues['EndeDatum'] := DateTimePicker2.Date;
Jetzt musst du noch etwas mit der DateTimePicker Komponente aufpassen!
DateTimePicker1.Date liefert nicht nur ein Datum, sondern auch noch eine Uhrzeit mit.
Deshalb:
Delphi-Quellcode:
  Query1.SQL.Text := 'select * from datum001'+
  // vereinfachte Version:
  // man beachte den Vergleichsoperator bei BisDatum
  ' where VonDatum >= : StartDatum and BisDatum < :EndeDatum';
  Query1.Parameters.ParamValues['StartDatum'] := Int(DateTimePicker1.Date);
  Query1.Parameters.ParamValues['EndeDatum'] := Int(DateTimePicker2.Date)+1.0; // +1.0 = Morgen

mewlos26 24. Okt 2005 13:50

Re: Datumsabfrage mit Access DB über Jahreswechsel
 
@shima

Und Du bist DIr sicher das dann die Datumszeiträume auch über einen Jahreswechsel ordnungsgemäß abgefragt werden?

Ich nehmer immer anstatt DateTimePicker.Date .. DateTimePicker.Text. Mit DateTimePicker.Text übernehme ich immer nur das Datum und schreibe es in die Access Datenbank weg.

shmia 24. Okt 2005 14:05

Re: Datumsabfrage mit Access DB über Jahreswechsel
 
Zitat:

Zitat von mewlos26
Und Du bist DIr sicher das dann die Datumszeiträume auch über einen Jahreswechsel ordnungsgemäß abgefragt werden?

Ganz sicher! Wichtig ist nur, dass die Datumsfelder den Typ "Datum/Uhrzeit" haben und
die Parameter mit dem Datentyp "TDateTime" befüllt werden.
Zitat:

Zitat von mewlos26
Ich nehmer immer anstatt DateTimePicker.Date .. DateTimePicker.Text. Mit DateTimePicker.Text übernehme ich immer nur das Datum und schreibe es in die Access Datenbank weg.

Das wäre eine schlechte Technik. Jedes Datum und/oder Uhrzeit, dass in einem Delphiprogramm
als String-Variable auftaucht, ist schlechter Programmierstil.
Grund
Ein Datum und/oder Uhrzeit kann als String auf min. 20 verschiedene Arten formatiert sein.
Die länderabhängigen Einstellungen von Windows bestimmen dieses Format mit.
Ein Programm, dass mit deutschem Datumsformat funktioniert, wird bei englischem Datumsformat versagen!!
Es gibt nur eines, auf das man sich verlassen kann und das ist der Datentyp TDateTime.
Wenn man also grundsätzlich immer nur mit TDateTime Variablen arbeitet, kann (mal abgesehen vom Zeitzonenproblem) nichts passieren.
Nur für die Ein- und Ausgabe von Datum und Uhrzeit darf in ein Stringformat gewandelt werden.

mewlos26 24. Okt 2005 15:42

Re: Datumsabfrage mit Access DB über Jahreswechsel
 
@shima

>die Parameter mit dem Datentyp "TDateTime" befüllt werden.

Kannst Du die Select Anweisung mit den Parametern mal anpassen und hier posten?

>Nur für die Ein- und Ausgabe von Datum und Uhrzeit darf in ein Stringformat gewandelt werden.[/quote]

Hast Du hierfür auch ein Beispiel?

shmia 24. Okt 2005 16:00

Re: Datumsabfrage mit Access DB über Jahreswechsel
 
Zitat:

Zitat von mewlos26
@shima
>die Parameter mit dem Datentyp "TDateTime" befüllt werden.
Kannst Du die Select Anweisung mit den Parametern mal anpassen und hier posten?

Hab' ich doch schon in meiner 1. Antwort getan.
Das Sourcecode Schnipsel enthält genau die Abfrage aus deinem Beispiel und ist komplett. Es fehlt nur noch Query1.Open.
Zitat:

Zitat von mewlos26
>Nur für die Ein- und Ausgabe von Datum und Uhrzeit darf in ein Stringformat gewandelt werden.
Hast Du hierfür auch ein Beispiel?

Es geht hier eher um Prinzip.
In dem folgenden Beispiel wird der nächste Arbeitstag berechnet.
Alle Operationen werden mit TDateTime ausgeführt.
Delphi-Quellcode:
function NextWorkingDay(const date:TDateTime; callback:THolidayCallback):TDateTime;
begin
   Result := Int(date) + 1.0;

   while (DayOfWeek(Result) in [1,7]) do // Samstag und Sonntag überspringen
      Result := Result + 1.0;
end;

var
   datum : TDateTime;
begin
   datum := SysUtils.Date; // heute
   datum := NextWorkingDay(datum);
   // Erst beim Anzeigen wird das Datum in einen String verwandelt
   ShowMessage('Nächster Arbeitstag ist '+DateToStr(datum));
end;


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