Datensätze mit Unixzeit abfragen

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Duesentrieb
User
Beiträge: 52
Registriert: Sonntag 16. März 2014, 17:14

Hallo,

ich möchte in einer Datenbank die Datensätze abfragen die innerhalb eines Tages angelegt wurden.
In der Tabelle gibt es die Spalte timestamp mit der Unixzeit.

Leider funktioniert mein Ansatz nicht:

Code: Alles auswählen


aktuellezeit = time.time()
startzeit = Aktuellezeit - 86400

cursor.execute ("select * FROM data WHERE (timestamp > startzeit) and (timestamp < aktuellezeit)")

Kann mir jemand helfen?
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du musst die Argumente uebergeben. Einfach irgendwelche Namen im SQL zu ersetzen waere ja nun eine ziemliche Katastrophe, oder? Denn du koennstest ja auch timestamp in deinem Code stehen haben, und woher soll dein Programm/Python dann wissen, das das aber bitteschoen nicht zu ersetzen ist?

Fuer diesen Zweck gibt es daher die parametrisierte Form von execute, zB so:

Code: Alles auswählen

cursor.execute ("select * FROM data WHERE (timestamp > ?) and (timestamp < ?)", (startzeit, aktuellezeit))
Ob es wirklich ? oder ein anderer Platzhalter in deinem Code sein soll, haengt davon ab, welche konkrete DB du verwendest. Das steht in dessen Dokumentation.

Edit: Schreibfehler, L statt ? getippt.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Wobei die Klammern im SQL überflüssig sind und SQL ``… BETWEEN … AND …`` kennt, was es IMHO leichter lesbar macht. Sofern man mit ≤ und ≥ für die Randwerte leben kann.

Wobei das ganze natürlich ein bisschen wackelig wird, denn man wird das Programm ja nie in genau 86.400 Sekunden-Abständen laufen haben, so das immer ein bisschen Überlappung oder eine Lücke entsteht bei der Abfrage, so dass man am Ende Datensätze nicht erfasst und welche mehrmals erfasst. Und ob die Uhrzeit auf dem Rechner wo die DB und damit die SQL-Abfrage abgearbeitet wird, und auf dem Rechner wo die Vergleichszeiten erzeugt werden, wirklich synchron laufen, ist auch noch mal eine Unwägbarkeit bei diesem Ansatz.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Duesentrieb
User
Beiträge: 52
Registriert: Sonntag 16. März 2014, 17:14

Hallo,
besten Dank für die Hinweise!
Klar, jetzt fällt es mir wieder ein dass es nicht so einfach war. Es müssen wohl % Platzhalter sein.
Jetzt habe ich ein Formatproblem:

query = query % args
ValueError: incomplete format

In der Datenbank bekomme ich das Format mit "BIGINT" ausgewiesen.
Das müsste doch eigentlich passen?

Edit: es muss ein %s sein. Damit ist das Formatproblem auch behoben!
Zuletzt geändert von Duesentrieb am Sonntag 23. Januar 2022, 18:10, insgesamt 1-mal geändert.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das ist kein Python, und nur irgendeine hingeworfene Umschreibung einer Fehlermeldung. Was ausser "haste halt falsch gemacht" soll man da jetzt zu sagen? Zeig was du wirklich fuer Code hast, und zeig, wie die wirkliche Fehlermeldung aussieht. Wie immer, oder?
Duesentrieb
User
Beiträge: 52
Registriert: Sonntag 16. März 2014, 17:14

Aber trotzdem muss ich noch einmal eine Frage stellen:
In der Datenbank hat der Zeitwert 13 Stellen: 164203984581
In Python bekomme ich einen Kommawert der noch dazu drei Stellen am Ende hat: 1642958303.0946624

Gibt es eine Lösung den Pythonwert zu reduzieren? Multiplizieren um das Komma zu schieben brachte leider nichts
Duesentrieb
User
Beiträge: 52
Registriert: Sonntag 16. März 2014, 17:14

__deets__ hat geschrieben: Sonntag 23. Januar 2022, 18:07 Das ist kein Python, und nur irgendeine hingeworfene Umschreibung einer Fehlermeldung. Was ausser "haste halt falsch gemacht" soll man da jetzt zu sagen? Zeig was du wirklich fuer Code hast, und zeig, wie die wirkliche Fehlermeldung aussieht. Wie immer, oder?
Ist doch erledigt. Hab den Fehler mit %s behoben
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Die Loesung liegt darin, statt den unterspezifizierten UNIX Timestamps (welche Zeitzone, Sommerzeit oder Winterzeit?) gleich die richtigen Datentypen zu benutzen. Auf beiden Seiten, also TIMESTAMP in der Datenbank, und datetime.datetime in Python. Dann verschwinden diese Probleme weitgehend.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Duesentrieb hat geschrieben: Sonntag 23. Januar 2022, 18:22 Ist doch erledigt. Hab den Fehler mit %s behoben
War es nicht, als ich die Antwort schrieb. Und die Anmerkungen dazu, wie man richtig Fehler beschreibt, behalten ja nun auch ihre Gueltigkeit, oder nicht?
Duesentrieb
User
Beiträge: 52
Registriert: Sonntag 16. März 2014, 17:14

__deets__ hat geschrieben: Sonntag 23. Januar 2022, 18:24
Duesentrieb hat geschrieben: Sonntag 23. Januar 2022, 18:22 Ist doch erledigt. Hab den Fehler mit %s behoben
War es nicht, als ich die Antwort schrieb. Und die Anmerkungen dazu, wie man richtig Fehler beschreibt, behalten ja nun auch ihre Gueltigkeit, oder nicht?
Dann warst du aber sehr schnell. Aber Recht hast du!
Duesentrieb
User
Beiträge: 52
Registriert: Sonntag 16. März 2014, 17:14

__deets__ hat geschrieben: Sonntag 23. Januar 2022, 18:23 Die Loesung liegt darin, statt den unterspezifizierten UNIX Timestamps (welche Zeitzone, Sommerzeit oder Winterzeit?) gleich die richtigen Datentypen zu benutzen. Auf beiden Seiten, also TIMESTAMP in der Datenbank, und datetime.datetime in Python. Dann verschwinden diese Probleme weitgehend.
Leider kann ich die Ursprungsdatenbank bzw. das Programm welches die befüllt nicht ändern.
Ich multipliziere jetzt mit 1000, dann klappt es.

Wenn es dann Überschneidungen gibt geht das im Rauschen unter
Antworten