WHERE condition mit Datum/Zeit

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Daniel_Berlin
Beiträge: 37
Registriert: So 31. Mai 2020, 21:13

WHERE condition mit Datum/Zeit

Beitrag von Daniel_Berlin »

Hallo,

ich hab mein Problem schon im engl. Forum geschildert, aber vielleicht ist es hier auch besser aufgehoben.
Ich hab zwei forms: in der ersten Form (select) soll der Benutzer eine Datum und eine Uhrzeit eingeben, die dann in einer Variablen vom typ string gespeichert wird, wenn der button zum starten der form 2 (test) gedrückt wird.
Ich bekomme auch ein Ergebnis in der Listview der FOrm2 aber das stimmt nicht. das eingegeben Datum mit der Uhrzeit wird im SQL statement als WHERE Bedingung nicht beachtet.
Wenn ich in MySQL das statement mit einem Datum im FOrmat yyyy-mm-dd hh:mm:ss eingebe, bekomme ich natürlich die richtige Ausgabe. Wenn ich in meinem Programm das Datum als yyyy-mm-dd eingebe, dann bekomme ich die Meldung: 2020-05-31 is not a valid date format.
Ich denke mal ich muss den string noch umwandeln??
Ich hab das auch nach vorherigen Forumeintrag mit den zwei folgenden Zeilen probiert, aber kein Erfolg
Form2.SQLQuery1.Params.CreateParam(ftDateTime, 'sqldta', ptInput);
Form2.SQLQuery1.ParamByName('sqldta').AsDateTime := dtA;


Könnt ihr mal bitte schauen? Anbei der Code der zwei Forms, ist nicht viel.

Code: Alles auswählen

unit select;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs,DB, StdCtrls;
 
type
 
  { TForm7 }
 
  TForm7 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    procedure Button1Click(Sender: TObject);
  private
 
  public
 
 
  end;
 
var
  Form7: TForm7;
  time1: TDateTime;
  stringDateTime : string;
 
implementation
uses test;
 
 
{$R *.lfm}
 
{ TForm7 }
 
 
 
 
procedure TForm7.Button1Click(Sender: TObject);
begin
 
    stringDatetime := Edit1.Text;
    time1:= StrtoDateTimes (stringDatetime)
 
    form8.ShowModal;
 
end;
 
 
 
end.
           
 
 
 
 
 
 
 
unit test;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ComCtrls,connect,DB, StdCtrls;
 
type
 
  { TForm8 }
 
  TForm8 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    ListViewTest: TListView;
    procedure FormShow(Sender: TObject);
  private
 
  public
 
  end;
 
var
  Form8: TForm8;
 
 
implementation
uses select;
 
 
{$R *.lfm}
 
   
{ TForm8 }
 
procedure addDatatoTest (ID,Delivery :string);
  var
    item : TListItem;
 
 
begin
 item := form8.ListViewGeld.Items.Add;
 item.caption := ID;
 item.Subitems.Add(Delivery);
 
 
 
 
 
Form2.connectDB;
   Form2.SQLQuery1.SQL.Text := 'SELECT * FROM test WHERE '''+stringDatetime+''' < delivery';
Form2.SQLQuery1.Open;
 
 
  while not Form2.SQLQuery1.Eof do
   begin
 
       // Datenbank abfragen und füllen  der Variablen
     variableID  := Form2.SQLQuery1.FieldByName('id').AsString;
     sringDelivery := Form2.SQLQuery1.FieldByName('delivery').AsString;
 
 
     addDatatoTest (stringID,stringDelivery);
    Form2.SQLQuery1.next;
 
end;


Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: WHERE condition mit Datum/Zeit

Beitrag von Mathias »

Und wen du nur StrToDate verwendest ?

Wieso nimmt du nicht drei SpinEdit ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: WHERE condition mit Datum/Zeit

Beitrag von af0815 »

was für ein Typ wird am MySql server für das Feld in der Tabelle test verwendet ? DateTime oder String?
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Daniel_Berlin
Beiträge: 37
Registriert: So 31. Mai 2020, 21:13

Re: WHERE condition mit Datum/Zeit

Beitrag von Daniel_Berlin »

Wenn ich nur 'StrtoDate

bekomm ich die Meldung, dass der Operator overloaded ist



Am Server ist für das Feld datetime(3) eingestellt, weil ich millisekunden mitspeicher

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: WHERE condition mit Datum/Zeit

Beitrag von af0815 »

mit datime und den Parametern sollte es gehen. datetime mit millisekunden wird nicht gehen. Da musst du mal die die maximale Genauigkeit von DateTime unter Lazarus ansehen. Ob das zusammenpasst.

Und Parameter unter Lazarus im Sql fangen mit : an. Wenn der fehlt ist es kein Parameter.

BTW. Ich habe eine massive Allergie gegen Stringgefrickel und * im SQL.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Daniel_Berlin
Beiträge: 37
Registriert: So 31. Mai 2020, 21:13

Re: WHERE condition mit Datum/Zeit

Beitrag von Daniel_Berlin »

Ich hab es jetzt wieder mit den paramenter gemacht:
Form2.connectDB;
Form2.SQLQuery1.SQL.Text := 'SELECT * FROM test WHERE :sqlzeit < delivery';
Form2.SQLQuery1.Params.CreateParam(ftDateTime, 'sqlzeit ', ptInput);
Form2.SQLQuery1.ParamByName('sqlzeit ').AsDateTime := time1;

Ich gebe das wie folgt jetzt ins Edit Feld ein nach Programmaufruf 11.06.2020 20:00:00
jetzt bekomme ich aber die Meldung: 11.06.2020 20:00:00 is not a valid date format

Wie würdest du aus dem Edit Feld die Das Datum und die Uhrzeit speichern, ohne string?

Zum vergleich würde ich die Millisekunden vernachlässigen. Ich benötige die nur in einer anderen Form nochmal zum hochzählen, aber das betrifft das das Thema "while schleife". Wenn das aber nichtz möglich ist, dann halt ohne millisekunden hochzählen.

Code: Alles auswählen

unit select;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs,DB, StdCtrls;
 
type
 
  { TForm7 }
 
  TForm7 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    procedure Button1Click(Sender: TObject);
  private
 
  public
 
 
  end;
 
var
  Form7: TForm7;
  time1: TDateTime;
  stringDateTime : string;
 
implementation
uses test;
 
 
{$R *.lfm}
 
{ TForm7 }
 
 
 
 
procedure TForm7.Button1Click(Sender: TObject);
begin
 
    stringDatetime := Edit1.Text;
    time1:= StrtoDateTimes (stringDatetime)
 
    form8.ShowModal;
 
end;
 
 
 
end.
           
 
 
 
 
 
 
 
unit test;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ComCtrls,connect,DB, StdCtrls;
 
type
 
  { TForm8 }
 
  TForm8 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    ListViewTest: TListView;
    procedure FormShow(Sender: TObject);
  private
 
  public
 
  end;
 
var
  Form8: TForm8;
 
 
implementation
uses select;
 
 
{$R *.lfm}
 
   
{ TForm8 }
 
procedure addDatatoTest (ID,Delivery :string);
  var
    item : TListItem;
 
 
begin
 item := form8.ListViewGeld.Items.Add;
 item.caption := ID;
 item.Subitems.Add(Delivery);
 
 
    Form2.connectDB;
    Form2.SQLQuery1.SQL.Text := 'SELECT * FROM test WHERE :sqlzeit < delivery';
    Form2.SQLQuery1.Params.CreateParam(ftDateTime, 'sqlzeit ', ptInput);
    Form2.SQLQuery1.ParamByName('sqlzeit ').AsDateTime := time1;   
 

 
  while not Form2.SQLQuery1.Eof do
   begin
 
       // Datenbank abfragen und füllen  der Variablen
     variableID  := Form2.SQLQuery1.FieldByName('id').AsString;
     sringDelivery := Form2.SQLQuery1.FieldByName('delivery').AsString;
 
 
     addDatatoTest (stringID,stringDelivery);
    Form2.SQLQuery1.next;
 
end;

Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: WHERE condition mit Datum/Zeit

Beitrag von Mathias »

Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Daniel_Berlin
Beiträge: 37
Registriert: So 31. Mai 2020, 21:13

Re: WHERE condition mit Datum/Zeit

Beitrag von Daniel_Berlin »

Da hab ich schon mehrmals geschaut, hat mich irgendwie nicht weiter gebracht.


Wenn ich nur das Datum 11.06.2020 eingebe, dann bekomme ich wieder alle Einträge.
Mit Eingabe der Uhrzeit bekomme ich wieder ungültiges Datumsformat. Dabei habe ich einen Insert Befehl, der genauso aufgebaut ist und da funktioniert es.

Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: WHERE condition mit Datum/Zeit

Beitrag von Mathias »

Evtl. ein Ländereinstellungs Problem.

Was spuckt dir dies aus ?

https://www.freepascal.org/docs-html/rt ... tostr.html
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: WHERE condition mit Datum/Zeit

Beitrag von af0815 »

aus dem Englischen Forum von eine User zu einem anderen Thema von paulnewyork dort und daniel_berlin hier
It is nearly impossible to provide help that way. Your code shows that you are making some basic fundamental and logical errors, and there is no way to address those this way and/or offer any guidance in those matters.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

sstvmaster
Beiträge: 575
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: WHERE condition mit Datum/Zeit

Beitrag von sstvmaster »

Oder StrToDate mit Parametern?

Code: Alles auswählen

StrToDate('2020-06-11', 'yyyy-mm-dd', '-')
LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

Daniel_Berlin
Beiträge: 37
Registriert: So 31. Mai 2020, 21:13

Re: WHERE condition mit Datum/Zeit

Beitrag von Daniel_Berlin »

@af0815

Ich hab dir eine Nachricht geschickt. Du hattest mir ja letztes mal auch das mit den Parameter gesagt
Ich könnte dir meinen Code nochmal schicken. Wenn du nochmal rüber schauen würdest.

Vielen Dank für eure Unterstützung!

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: WHERE condition mit Datum/Zeit

Beitrag von af0815 »

Wenn man Parameter konsequent verwendet und dazu auf der Db Seite den richtigen DateTime Typ dann funktioniert es. Meiner Erfahrung nach (und ich bin DB mässig rofessional Programmer) bringt eine jede String Verarbeitung im SQL nur Probleme und unlösbare Rätsel. Allein schon dadurch das das Datumsformat immer anders als gedacht interpretiert wird. Sowohl von den DB-Komponenten als auch von dem Server selbst.

Ein open oder ExeclSQL ohne entsprechende Kaspelung mit try except und dazugehöriger Auswertung verschleppt einen jeden Fehler. Vergisst man bei einem Parameter den doppelpunkt am Anfang wird er als lokaler Bezeichner interpretiert und entsprechend nicht richtig verwendet.

Die Verwendung von * in einem select bedeuttet, das man absolut nicht sieht welche Felder wirklich verwendet werden und ist meiner Meinung nach absolut zu vermeiden. Das provoziert nur versteckte/verschleppte Fehler.

Das Design mit der Formübergreifenden Query, die nicht in sich gekapselt sind, ist ein weitere Horr den Code zu lesen und zu warten. Ich bin nein Anhänger der lokal erzeugten Queries, die absolut unit lokal sind oder maximal in Datemodulen zusammengefasst sind. Alles andere ist eine permanente Fehlerquelle. Der Code muss wartbar unbd auch nach x Jahren lesbar sein, dann ist es richtig. Ausserdem sollte jede Unit für sich testbar sein. Damit könnte man auc jederzeit ein einfaches Beispiel erzeugen und das hier publizieren. Alles andere ist Glaskugellesen und dafür ist mir meine Freizeit zu schade.

Ich klinke mich hier und im englischen Forum aus der Diskussion über diese DB komplett aus. Ignore List ist aktualisiert.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: WHERE condition mit Datum/Zeit

Beitrag von Mathias »

Mathias hat geschrieben:
Do 11. Jun 2020, 20:41
Evtl. ein Ländereinstellungs Problem.

Was spuckt dir dies aus ?

https://www.freepascal.org/docs-html/rt ... tostr.html
Hast du dies mal probiert ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Daniel_Berlin
Beiträge: 37
Registriert: So 31. Mai 2020, 21:13

Re: WHERE condition mit Datum/Zeit

Beitrag von Daniel_Berlin »

Hab ich jetzt probiert:

Code: Alles auswählen

     time1:= Edit1.Text;
     stringDateTime := DateTimeToStr(time1);  
Jetzt bekomm ich für die Zeile die Meldung:
abfragen.pas(62,19) Error: Incompatible types: got "TTranslateString" expected "TDateTime"

in time1 wurde anscheinend nicht als TDateTime abgespeichert. Der Datentyp ist aber als TDateTime definiert.

Antworten