AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Datumsabfrage mit Access DB über Jahreswechsel
Thema durchsuchen
Ansicht
Themen-Optionen

Datumsabfrage mit Access DB über Jahreswechsel

Ein Thema von mewlos26 · begonnen am 24. Okt 2005 · letzter Beitrag vom 24. Okt 2005
Antwort Antwort
mewlos26

Registriert seit: 17. Okt 2005
13 Beiträge
 
Delphi 7 Professional
 
#1

Datumsabfrage mit Access DB über Jahreswechsel

  Alt 24. Okt 2005, 12:30
Datenbank: Access 2002 • Version: 10.0 • Zugriff über: ADO
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;
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

Re: Datumsabfrage mit Access DB über Jahreswechsel

  Alt 24. Okt 2005, 13:04
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
Andreas
  Mit Zitat antworten Zitat
mewlos26

Registriert seit: 17. Okt 2005
13 Beiträge
 
Delphi 7 Professional
 
#3

Re: Datumsabfrage mit Access DB über Jahreswechsel

  Alt 24. Okt 2005, 13:50
@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.
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#4

Re: Datumsabfrage mit Access DB über Jahreswechsel

  Alt 24. Okt 2005, 14:05
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 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.
Andreas
  Mit Zitat antworten Zitat
mewlos26

Registriert seit: 17. Okt 2005
13 Beiträge
 
Delphi 7 Professional
 
#5

Re: Datumsabfrage mit Access DB über Jahreswechsel

  Alt 24. Okt 2005, 15:42
@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?
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#6

Re: Datumsabfrage mit Access DB über Jahreswechsel

  Alt 24. Okt 2005, 16:00
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 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;
Andreas
  Mit Zitat antworten Zitat
Antwort Antwort


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 08:33 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