AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi SQLite SELECT Abfrage mit WHERE auf ein time Feld
Thema durchsuchen
Ansicht
Themen-Optionen

SQLite SELECT Abfrage mit WHERE auf ein time Feld

Ein Thema von hewy · begonnen am 26. Feb 2025 · letzter Beitrag vom 27. Feb 2025
Antwort Antwort
hewy

Registriert seit: 2. Aug 2006
Ort: Arni (Region Zürich) Schweiz
83 Beiträge
 
Delphi XE5 Enterprise
 
#1

SQLite SELECT Abfrage mit WHERE auf ein time Feld

  Alt 26. Feb 2025, 21:19
Datenbank: SQLite • Version: 3.10.0 • Zugriff über: Delphi FireDAC
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
Heinrich Wyssen

Geändert von hewy (26. Feb 2025 um 21:37 Uhr)
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
3.018 Beiträge
 
Delphi 12 Athens
 
#2

AW: SQLite SELECT Abfrage mit WHERE auf ein time Feld

  Alt 26. Feb 2025, 22:17
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.
Grüße
TurboMagic
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.814 Beiträge
 
Delphi 12 Athens
 
#3

AW: SQLite SELECT Abfrage mit WHERE auf ein time Feld

  Alt 26. Feb 2025, 22:58
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');
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
hewy

Registriert seit: 2. Aug 2006
Ort: Arni (Region Zürich) Schweiz
83 Beiträge
 
Delphi XE5 Enterprise
 
#4

AW: SQLite SELECT Abfrage mit WHERE auf ein time Feld

  Alt 27. Feb 2025, 22:02
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.
Heinrich Wyssen
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:00 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 by Thomas Breitkreuz