![]() |
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; |
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:
Jetzt musst du noch etwas mit der DateTimePicker Komponente aufpassen!
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; 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 |
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. |
Re: Datumsabfrage mit Access DB über Jahreswechsel
Zitat:
die Parameter mit dem Datentyp "TDateTime" befüllt werden. Zitat:
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. |
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? |
Re: Datumsabfrage mit Access DB über Jahreswechsel
Zitat:
Das Sourcecode Schnipsel enthält genau die Abfrage aus deinem Beispiel und ist komplett. Es fehlt nur noch Query1.Open. Zitat:
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 06:10 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz