Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQLite SELECT Abfrage mit WHERE auf ein time Feld (https://www.delphipraxis.net/216769-sqlite-select-abfrage-mit-where-auf-ein-time-feld.html)

hewy 26. Feb 2025 20:19

Datenbank: SQLite • Version: 3.10.0 • Zugriff über: Delphi FireDAC

SQLite SELECT Abfrage mit WHERE auf ein time Feld
 
in einer SQLite Datenbank habe ich unter anderem zwei Felder
[EntryDate] DATE,
[EntryTime] TIME,
Nun mache ich folgende Abfrage:

Datum / Zeit übergebe ich im Delphi Code mit hilfe von Parameter
WHERE EntryDate = :EntryDate AND EntryTime = :EntryTime

SELECT Id, EntryDate, EntryTime FROM Tm_TimeRawData WHERE EntryDate = "2025-02-23"
Ergibt:
Id EntryDate EntryTime
3677 2025-02-23 10:51:00.000
3678 2025-02-23 11:49:00.000
3679 2025-02-23 12:23:00.000

Möchte nun aber auch noch eine bestimmte Zeit haben also mit dieser Abfrage
SELECT Id, EntryDate, EntryTime FROM Tm_TimeRawData WHERE EntryDate = "2025-02-23" AND EntryTime = "11:49:00"
Ergibt aber leider kein resultat

Wie kann ich die WHERE Klausel für das Zeit Feld EntryTime dazu bringen mir den gewünschten Datensatz zu liefern?

Schreibe ich EntryTime = "11:49:00.000" bringt nicht
Schreibe ich EntryTime > "11:49:00" dann werden alle weiteren inklusive 11:49 angezeigt
Schreibe ich nun WHERE EntryDate = "2025-02-23" AND EntryTime > "11:49:00" Order by EntryTime LIMIT 1
Dann erhalte ich den gewünschten Datensatz allerdings finde ich dies doch etwas seltsam. Sollte doch eleganter gehen.

Vielleicht hat jemand eine idee oder kennt das bereits
Wäre sehr Dankbar für jegliche Hinweise wie das zu lösen ist.
Gruss und Danke HeWy

TurboMagic 26. Feb 2025 21:17

AW: SQLite SELECT Abfrage mit WHERE auf ein time Feld
 
Hallo

naja, Datums- und Zeitwerte werden intern meist als Fließkommazahl abgebildet.
In Delphi z. B. Double. Der ganzzahlige Teil ist dabei die Anzahl der Tage seit
einem bestimmten Startdatum (bei Delphi glaube ich 30.12.1899). Das kann ohne
Verluste repräsentiert werden.

Die Zeit ist dann der Nachkommateil und bei Fließkommazahlen gibt's prinzipbedingt
den Effekt, dass man nicht jede Nachkommazahl exakt repräsentieren kann.

Ich könnte mir also sowas vorstellen:

(EntryTime >= "11:49:00") and (EntryTime <= "11:49:01")

ggf. noch genauer, je nach dem wie genau die Zeit urspründlich erfasst wurde.

jaenicke 26. Feb 2025 21:58

AW: SQLite SELECT Abfrage mit WHERE auf ein time Feld
 
Das liegt daran, dass SQLite die Daten als Text ablegt. Du musst für den Vergleich daher für ein passendes Format sorgen:
Code:
SELECT Id, EntryDate, EntryTime
FROM Tm_TimeRawData
WHERE EntryDate = '2025-02-23'
AND strftime('%H:%M:%S', EntryTime) = '11:49:00';
Alternativ geht es mit LIKE:
Code:
SELECT Id, EntryDate, EntryTime
FROM Tm_TimeRawData
WHERE EntryDate = '2025-02-23'
AND EntryTime LIKE '11:49:00%';
Das habe ich hier online getestet:
https://sqliteonline.com/
Zur vorherigen Erstellung der DB habe ich dies verwendet:
Code:
CREATE TABLE Tm_TimeRawData (
    Id INTEGER PRIMARY KEY AUTOINCREMENT,
    EntryDate DATE,
    EntryTime TIME
);

INSERT INTO Tm_TimeRawData (EntryDate, EntryTime) VALUES
('2025-02-23', '10:51:00.000'),
('2025-02-23', '11:49:00.000'),
('2025-02-23', '12:23:00.000');

hewy 27. Feb 2025 21:02

AW: SQLite SELECT Abfrage mit WHERE auf ein time Feld
 
Vielen Dank Jaenicke,
das hat mir schonmal weiter geholfen.
Nun habe ich es nochmals anders gelöst.
An Stelle vom Datum Speichere ich nun auch UNIXTime vom Datum mit Zeit dadurch kann ich sauber suchen.
Also DB um ein Feld erweitert inRefDateTime
Das sieht dann so aus:
Id EntryDate EntryTime RefDate
16429 2025-02-23 10:51:00.000 1740307860
16439 2025-02-23 10:51:00.000 1740307860
16440 2025-02-23 11:39:00.000 1740310740
16441 2025-02-23 11:49:00.000 1740311340
Wobei RefDate dem EntryDate mit der EntryTime entspricht.
Damit habe ich eine saubere Lösung die leicht zu Handhaben ist und mich vom nicht wirklich einfachen Umgang mit Date und Time Felder befreit.
Danke dennoch für deinen Hint werde ich sich bei anderer Gelegenheit auch mal gebrauchen könne.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:52 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-2025 by Thomas Breitkreuz