Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Abfrage nach Datum (https://www.delphipraxis.net/70227-abfrage-nach-datum.html)

davar 27. Mai 2006 07:18

Datenbank: MySQL • Version: 4.x • Zugriff über: Zeos

Abfrage nach Datum
 
Hallo Leute,

man merkt wohl, dass ich wieder hart am Arbeiten bin :wink:

Die Frage wurde schon einige Male gestellt, habe die verschiedenen Varianten auch ausprobiert - geht aber immer noch nicht.

Also folgende Abfrage:

Delphi-Quellcode:
DecodeDate(DTPvon.date, Jahr, Monat, Tag);
sdatumvon:= inttostr(Jahr) + '-' + inttostr(Monat) + '-' + inttostr(Tag);

query.SQL.text:= 'SELECT * FROM `arbeitszeit` WHERE datum > ' + sdatumvon;
geht nicht.

Ebenso auch das hier:

Delphi-Quellcode:
DecodeDate(DTPvon.date, Jahr, Monat, Tag);
sdatumvon:= inttostr(Jahr) + '-' + inttostr(Monat) + '-' + inttostr(Tag);

DecodeDate(DTPbis.date, Jahr, Monat, Tag);
sdatumbis:= inttostr(Jahr) + '-' + inttostr(Monat) + '-' + inttostr(Tag);

query.SQL.text:= 'SELECT * FROM `arbeitszeit` WHERE datum BETWEEN ' + sdatumvon + ' AND ' + sdatumbis;
Das Datum wird dabei überhaupt nicht berücksichtigt.

Mit
Delphi-Quellcode:
showmessage(query.Fieldbyname('datum').AsString);
wird mir z.B. "15.05.2006" angezeigt. Sollte hier nicht eigentlich das Format YYYY-MM-DD verwendet werden? Und wenn ich das datum nicht umkodiere, sondern direkt "DTPvon.date" nehme, bekomme ich auch eine Fehlermeldung, diesmal, dass die SQL-Syntax nicht korrekt ist..


Jetzt hab ich mal zum Test
Delphi-Quellcode:
query.SQL.text:= 'SELECT * FROM `arbeitszeit` WHERE datum < ' + sdatumvon;
eingegeben und nun werden mir alle Datensätze angezeigt, in denen das Datum leer ist..

Irgendwie weiss ich nicht mehr weiter..

MfG

davar

marabu 27. Mai 2006 07:27

Re: Abfrage nach Datum
 
Guten Morgen.

Wenn du mit Parametern arbeitest, dann vergisst du nicht deine Datum-Strings in Hochkommata einzupacken:

Delphi-Quellcode:
QuotedStr(sDatumVon)
Grüße vom marabu

davar 27. Mai 2006 07:47

Re: Abfrage nach Datum
 
Zitat:

Zitat von marabu
Guten Morgen.

Wenn du mit Parametern arbeitest, dann vergisst du nicht deine Datum-Strings in Hochkommata einzupacken:

Delphi-Quellcode:
QuotedStr(sDatumVon)
Grüße vom marabu

Das ist es gewesen. Danke!

Sharky 27. Mai 2006 07:50

Re: Abfrage nach Datum
 
Zitat:

Zitat von davar
... Das ist es gewesen. Danke!

Hai davar,

Du solltest trotzdem lieber mit Parametern arbeiten. Das hat riesen Vorteile.

davar 27. Mai 2006 08:01

Re: Abfrage nach Datum
 
Zitat:

Zitat von Sharky
Du solltest trotzdem lieber mit Parametern arbeiten. Das hat riesen Vorteile.

Hab ich vorhin versucht, hab aber eine Fehlermeldung bekommen. Bin dann davon ausgegangen, dass Zeos nicht so mit Parametern umgeht wie die normale TQuery-Komponente.

Was für Vorteile bringen denn Parameter? Bis jetzt habe ich keinen Unterschied festgestellt und so wie ich es jetzt mache war es eigentlich bequemer für mich..

Sharky 27. Mai 2006 08:11

Re: Abfrage nach Datum
 
Zitat:

Zitat von davar
... Was für Vorteile bringen denn Parameter? ...

Einer der Vorteile ist das Du dich nicht darum kümmern musst das die Daten im richtigen Format zum Server kommen. Gerade bei DateTime-Feldern musst Du ja, wenn Du es als String übergibst, immer wissen wie die Datenbank das Datum haben möchte.
Mit Parametern sähe das einfach so aus:
Delphi-Quellcode:
begin
  with Query do
  begin
    Close;
    SQL.Text := 'SELECT * FROM arbeitszeit WHERE datum BETWEEN :datumvon AND :datumbis';
    ParamCheck := True;
    ParamByName('datumvon').AsDate := DTPvon.date;
    ParamByName('datumbis').AsDate := DTPbis.date;
    Open;
  end;
end;

davar 27. Mai 2006 08:27

Re: Abfrage nach Datum
 
Genau so
Delphi-Quellcode:
with query do
begin
     Close;
     SQL.text:= 'SELECT * FROM `arbeitszeit` WHERE kundennummer = ' + querykunden.Fieldbyname('kundennummer').AsString + ' AND datum BETWEEN :datumvon AND :datumbis' ;
     ParamCheck:= true;
     ParamByName('datumvon').AsDate := DTPvon.date;
     ParamByName('datumbis').AsDate := DTPbis.date;
     Open;
end;
hab ich es jetzt gemacht, aber nun kommt die Meldung "Parameter 'kundennummer' nicht gefunden.' " Und genauso mit "datumvon", wenn ich "kundennummer" weglasse. Kann es sein, dass TZMySQLQuery anders mit Parametern umgeht als TQuery?

Sharky 27. Mai 2006 08:34

Re: Abfrage nach Datum
 
Hmmm ich arbeite ja auch mit den Zeos-Komponenten für den Zugriff auf mySQL. Ich würde es mal so versucben:

Delphi-Quellcode:
with query do
begin
     Close;
     SQL.text:= 'SELECT * FROM `arbeitszeit` WHERE (kundennummer = :kundennummer) AND (datum BETWEEN :datumvon AND :datumbis)';
     ParamCheck:= true;
     ParamByName('kundennummer').AsString := querykunden.Fieldbyname('kundennummer').AsString;
     ParamByName('datumvon').AsDate := DTPvon.date;
     ParamByName('datumbis').AsDate := DTPbis.date;
     Open;
end;
Aber noch eine andere Frage: Warum speicherst Du die Kundennummer in der Arbeitszeittabelle? Besser wäre doch die ID (PrimaryKey) als Referenz zu verwenden.
Ach ja, ist die "Kundennummer" ein String oder nur eine Zahl? Wenn eine Zahl könntest Du natürlich auch .AsInteger als Übergabeformat benutzen.

davar 27. Mai 2006 08:56

Re: Abfrage nach Datum
 
Zitat:

Zitat von Sharky
Hmmm ich arbeite ja auch mit den Zeos-Komponenten für den Zugriff auf mySQL. Ich würde es mal so versucben:

Delphi-Quellcode:
with query do
begin
     Close;
     SQL.text:= 'SELECT * FROM `arbeitszeit` WHERE (kundennummer = :kundennummer) AND (datum BETWEEN :datumvon AND :datumbis)';
     ParamCheck:= true;
     ParamByName('kundennummer').AsString := querykunden.Fieldbyname('kundennummer').AsString;
     ParamByName('datumvon').AsDate := DTPvon.date;
     ParamByName('datumbis').AsDate := DTPbis.date;
     Open;
end;

Nein, auch so hilft es nicht. Bin schon kurz davor, das Arbeiten mit Parametern aufzugeben. Immer noch die gleiche Fehlermeldung.

Zitat:

Zitat von Sharky

Aber noch eine andere Frage: Warum speicherst Du die Kundennummer in der Arbeitszeittabelle? Besser wäre doch die ID (PrimaryKey) als Referenz zu verwenden.

Es werden die Arbeitszeiten von mehreren Kunden erfasst und es gibt eine Spalte für die Mitarbeiternummer, damit man mit den selben Daten die Arbeitszeit der Mitarbeiter ermitteln kann.

Zitat:

Zitat von Sharky
Ach ja, ist die "Kundennummer" ein String oder nur eine Zahl? Wenn eine Zahl könntest Du natürlich auch .AsInteger als Übergabeformat benutzen.

Hab ich auch als Integer versucht, aber daran liegt es auch nicht.. :cry:

Sharky 27. Mai 2006 09:03

Re: Abfrage nach Datum
 
Zitat:

Zitat von davar
... Kann es sein, dass TZMySQLQuery anders mit Parametern umgeht als TQuery?

Mit welcher Zeos-Version arbeitest Du denn? Bei mir heisst die Zeos-Query-Klasse: TZQuery.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:02 Uhr.
Seite 1 von 2  1 2      

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