SQlite SQL Abfrage mit Datumsformat

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
RSO
Beiträge: 19
Registriert: Mi 9. Feb 2022, 22:43

SQlite SQL Abfrage mit Datumsformat

Beitrag von RSO »

Hallo,

ich experimentiere mit SQlite und habe eine kleine Datenbank aufgebaut.
Bis jetzt hat die Umsetzung ganz gut funktioniert.
Nun mochte ich in der SQL-Abfrage die Datenfelder von der Form1 (edit5.text und edit6.text) als Variable -> Datumvon und Datumbis verwenden.
Schreibe ich das Datum im Klartext z.B. 2022-08-01 funktioniert die Abfrage. Wie muß ich die Datumsfelder für den Select
formatieren?
Das Datenfeld Datum ist zur Zeit VarChar, kann aber geändert werden. (SQlite akzeptiert ja alles :)

Vielen Dank im Voraus für Eure Hilfe.

Code: Alles auswählen

procedure TForm1.ZeitraumAbfrage;
var
  Datumvon : String;
  Datumbis : String;
begin
  Datumvon := edit5.Text;
  Datumbis := edit6.Text;

  SQLQuery1.close;
  SQLQuery1.sql.clear;
  SQLite3Connection1.Connected := true;
  SQLQuery1.sql.clear;
  SQLQuery1.sql.text := 'select sum(betrag) from tabelle1 where Gruppe = 2 AND Datum >= Datumvon OR Datum <= Datumbis';
  SQLQuery1.active := true;
  summeLabel.caption := Form1.SQLQuery1.FieldByName('Sum(Betrag)').asString;
 // LoadData;
  SQLQuery1.open;
  DBGrid1.datasource := DataSource1;

  DBGrid1.autofillcolumns := true;
 end;            

RSO
Beiträge: 19
Registriert: Mi 9. Feb 2022, 22:43

gelöst: SQlite SQL Abfrage mit Datumsformat

Beitrag von RSO »

So funktioniert die SQL mit Datumsübernahme aus einem Edit.txt

Code: Alles auswählen


procedure TForm1.ZeitraumAbfrage;
var
  von, bis :String;
  Datumvon : String;
  Datumbis : String;
begin
  von := edit5.Text;
  bis := edit6.Text;

  SQLQuery1.close;
  SQLQuery1.sql.clear;
  SQLite3Connection1.Connected := true;
  SQLQuery1.sql.clear;
  SQLQuery1.sql.text := 'select sum(betrag) from tabelle1 where Gruppe = 2 AND Datum >= :Datumvon OR Datum <= :Datumbis';
  SQLQuery1.ParamByName('Datumvon').asString := von;
  SQLQuery1.ParamByName('Datumbis').asString := bis;

  MessageDlg('meld  ' + von, mtConfirmation, mbYesNo,0);

  SQLQuery1.active := true;
  summeLabel.caption := Form1.SQLQuery1.FieldByName('Sum(Betrag)').asString;
 // LoadData;
  SQLQuery1.open;
  DBGrid1.datasource := DataSource1;

  DBGrid1.autofillcolumns := true;
 end;              

Epcop
Beiträge: 140
Registriert: Di 29. Mai 2012, 09:36

Re: SQlite SQL Abfrage mit Datumsformat

Beitrag von Epcop »

Statt

Code: Alles auswählen

Datum >= :Datumvon OR Datum <= :Datumbis
Besser das?

Code: Alles auswählen

(Datum >= :Datumvon AND Datum <= :Datumbis)


Und bei den Eingabefelder Edit5 und Edit6 musst du aufpassen, dass das Datumsformat korrekt eingegeben wird ("2.9.22" o.ä. führt wahrscheinlich zu Problemen). Evtl. überprüfen oder diesen Datepicker zur Eingabe nehmen.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6208
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: SQlite SQL Abfrage mit Datumsformat

Beitrag von af0815 »

Ein Datum sollte immer ein Datum sein und kein String. Das macht später immer Probleme wenn man es nicht vermutet. Mir ist schon klar das gerade SQLite da ein gestörtes Verhältnis hat und so ziemlich alles als String akzeptiert.

Sqlite kann das Datum auf 3 verschieden Weisen verwalten siehe http://www.sqlite.org/matrix/datatype3.html .

Wenn du String verwendest, so muss du es immer im ISO8601 Format machen und bist auch selbst dafür verantwortlich. Lazarus mit seinen TDateTime Funktionen wird dich beim String nicht unterstützen. Überlege dir gut, welchen Tiger du da am Schwanz ziehst.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

charlytango
Beiträge: 843
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: SQlite SQL Abfrage mit Datumsformat

Beitrag von charlytango »

af0815 hat geschrieben:
Fr 2. Sep 2022, 22:13
Ein Datum sollte immer ein Datum sein und kein String.
kann da af0815 nur zustimmen. Auch in SQLite definiere ich Datumsfelder immer als DATE.
Dann klappt es auch falls ich auf die irre Idee kommen sollte mal die Datenbank zu wechseln.
Und warum sollte ich mir Probleme einhandeln wollen die durch die Lazarus Zugriffskomponenten (oder auch durch ZEOS) bereits verlässlich gelöst wurden?

RSO
Beiträge: 19
Registriert: Mi 9. Feb 2022, 22:43

Re: SQlite SQL Abfrage mit Datumsformat

Beitrag von RSO »

Hallo,

vielen Dank für die Hilfestellung.

Das Feld Datum baue ich auf Date um.
Und für die Datumseingabe habe ich eine kleine
Konvertierungsfunktion geschrieben.

Code: Alles auswählen

SQLQuery1.sql.text := 'select sum(betrag) from tabelle1 where Gruppe = 2 AND Datum >= :Datumvon OR Datum <= :Datumbis';
  SQLQuery1.ParamByName('Datumvon').asString := von;
  SQLQuery1.ParamByName('Datumbis').asString := bis;   
Diese Umwandlung der Datentypen und Einbau in die SQL-Abfrage ist gewöhnungsbedürftig.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6208
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: SQlite SQL Abfrage mit Datumsformat

Beitrag von af0815 »

Gewöhnungsbedürtig ja, vielleicht. Nur mit dem blöden String kannst du ganz rasch 'unerklärliche' Probleme haben, nur weil dein Kollege, Freund, whatever eine andere Einstellung im System hat und das Datum halt anders ein gibt. Boom und dann suche mal :-)

Geil sind so Sachen, wenn ein chinesicher Computer mit deutschen Einstellungen läuft unter Windows läuft - echt geil :-) Das bringt amerikanosche Administratoren zum Weinen, wenn das aufgrund der Software so sein muss. Hehe alles schon erlebt.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

shokwave
Beiträge: 470
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
CPU-Target: i386, x64
Wohnort: Gera

Re: SQlite SQL Abfrage mit Datumsformat

Beitrag von shokwave »

Eine Frage an die SQL-Profis:Sollte "BETWEEN" nicht auch gehen und leserlicher sein?

Code: Alles auswählen

SQLQuery1.sql.text := 'select sum(betrag) from tabelle1 where Gruppe = 2 AND Datum BETWEEN :Datumvon AND :Datumbis';
  SQLQuery1.ParamByName('Datumvon').asString := von;
  SQLQuery1.ParamByName('Datumbis').asString := bis;
mfg Ingo

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6208
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: SQlite SQL Abfrage mit Datumsformat

Beitrag von af0815 »

shokwave hat geschrieben:
Mo 5. Sep 2022, 17:56
Eine Frage an die SQL-Profis:Sollte "BETWEEN" nicht auch gehen und leserlicher sein?
Antwort von Radio Eriwan: Im Prinzip ja

Ob Between funktioniert hängt davon ab, ob das SQL der DB das unterstützt. Da gibt es zwischen den Systemen beträchtliche Unterschiede.

Grundlegend sollte es mit numerischen Werten bei SQLite gehen. Siehe u.a. https://www.sqlitetutorial.net/sqlite-between/ aber sicher nicht mit Strings.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

RSO
Beiträge: 19
Registriert: Mi 9. Feb 2022, 22:43

Re: SQlite SQL Abfrage mit Datumsformat

Beitrag von RSO »

Hallo,

in diesem Fall funktioniert between nicht. Habe ich schon ausprobiert,
Die SQL Abfragen kann man auch sehr schön mit dem SQLite Browser
ausprobieren.

Epcop
Beiträge: 140
Registriert: Di 29. Mai 2012, 09:36

Re: SQlite SQL Abfrage mit Datumsformat

Beitrag von Epcop »

Warum keine Klammern verwenden?

Antworten