Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   FreePascal Unix Timestamp als Integer und WHERE Bedingung bei SQLIte (https://www.delphipraxis.net/199938-unix-timestamp-als-integer-und-where-bedingung-bei-sqlite.html)

Beach 3. Mär 2019 21:35

Datenbank: SQLite • Version: 3 • Zugriff über: ZEOS

Unix Timestamp als Integer und WHERE Bedingung bei SQLIte
 
Hallo zusammen,

bin noch recht neu im Bereich Programmieren und arbeite mit Lazarus 1.8.4
Zur Zeit versuche ich als Übung eine Art Stundenzettel mit Speicherung der Daten in einer DB zu programmieren.
Habe auch mittlerweile vieles hinbekommen. Aber im Moment scheitere ich an einer WHERE Klausel und finde einfach meinen Fehler nicht.

Nach langem lesen und einigem Ausprobieren habe ich mich entschieden mit dem Unix Timestamp in einer Integer Spalte zu arbeiten.
Hab vor ewigen Zeiten mal einiges fürs Internet gescripted und kam damit immer am besten klar.

Nun versuche ich einfach alle Einträge auszugeben, die in einem bestimmten Zeitraum liegen.
Prinzip: SELECT * FROM tabelle WHERE spalte BETWEEN anfangTS AND endeTS

Aber irgendwie habe ich immer ein leeres Resultat. Kopiere ich diese Abfrage in den SQLite DB Browser, bekomme ich brav angezeigt was ich suche.

Query - Verbindung zur SQLite über TZConection und TZQuery
Memo1 - ein einfaches Memo Feld zur Ausgabe.
Im Debugger wird die WHILE Schleife immer übersprungen. EOF steht auf TRUE

Delphi-Quellcode:
  Query.sql.Clear;
  Query.Params.CreateParam( ftInteger, 'anfang', ptInputOutput);
  Query.Params.CreateParam( ftInteger, 'ende', ptInputOutput);


  Query.SQL.Text := 'SELECT * FROM dailyreport WHERE day BETWEEN :anfang AND :ende';
  Query.Params.ParamByName( 'anfang' ).AsInteger := 1551398400;
  Query.Params.ParamByName( 'ende' ).AsInteger:=1551484800;
  Query.Open;
    While not Query.EOF do
    begin
      Memo1.Lines.Add( Query.fieldByName('day').AsString );
      Memo1.Lines.Add( Query.fieldByName('id').AsString );
      Query.Next
    end;
  Query.Close;
Aufbau der Tabelle:
Delphi-Quellcode:
CREATE TABLE "dailyreport" (
   "id"          INTEGER PRIMARY KEY AUTOINCREMENT,
   "hour"          INTEGER,
   "personal_number"  INTEGER,
   "id_order"  INTEGER,
   "id_key"  INTEGER,
   "day"          INTEGER,
   "remark"  TEXT
)
Testinhalt der Tabelle:
 
id hour personal_number id_order id_key day remark
2 20 13 1 7 1551369365 Etwas anderes
3 60 13 1 6 1551370574 Noch was anderes
4 50 13 1 6 1551428082
5 30 13 1 5 1551428091

hoika 4. Mär 2019 09:56

AW: Unix Timestamp als Integer und WHERE Bedingung bei SQLIte
 
Hallo,
AsInteger := 1551398400;

Ist das nicht zu gross für einen Integer?
Gibt es vielleicht ein AsInt64?

Siehe auch hier
http://zeoslib.sourceforge.net/viewtopic.php?t=4765

scrat1979 4. Mär 2019 10:12

AW: Unix Timestamp als Integer und WHERE Bedingung bei SQLIte
 
Wenn es nicht unbedingt der Unix Timestamp sein muss dann nimm doch den Feldtyp TDateTime. Den könntest du auch in Delphi zu einem Unixtimestamp hin- und herkonvertieren wenn es denn sein muss. Dazu ist der Feldtyp TDateTime ja gedacht :)

Beach 4. Mär 2019 11:59

AW: Unix Timestamp als Integer und WHERE Bedingung bei SQLIte
 
Zitat:

Zitat von hoika (Beitrag 1426890)
[...]
Ist das nicht zu gross für einen Integer?
Gibt es vielleicht ein AsInt64?
[..]

Ja, es war zu groß dafür.:wall: Und es gibt ein AsLargeInt()
Damit klappt's dann auch.

Vielen Dank.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:36 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