Lassen Sie mich Dinge von Kommentaren zu meiner Antwort umschreiben. Sie möchten den timestamp
Typ anstelle von integer
verwenden, einfach weil das genau dafür gedacht ist. Manuelles Konvertieren zwischen Timestamp-Integern und timestamp
Objekten ist nur ein Schmerz und du gewinnst nichts. Und Sie werden es schließlich für komplexere Datetime-basierte Abfragen benötigen.
Um eine Frage über Paginierung zu beantworten. Sie tun einfach eine Abfrage
SELECT *
FROM table_name
WHERE created < lastTimestamp
ORDER BY created DESC
LIMIT 30
Wenn es erste Abfrage ist dann stellen Sie lastTimestamp = '3000-01-01'
sagen. Andernfalls setzen Sie lastTimestamp = last_query.last_row.created
.
Optimierung
Beachten Sie, dass, wenn die Tabelle groß dann ORDER BY created DESC
ist nicht effizient sein könnte (vor allem, wenn parallel mit unterschiedlichen Bereichen genannt). In diesem Fall können Sie „Zeitfenster“ verwenden, zum Beispiel bewegt:
SELECT *
FROM table_name
WHERE
created < lastTimestamp
AND created >= lastTimestamp - interval '1 day'
Das 1 day
Intervall arbitrarly gerichtet (stimmen Sie es auf Ihre Bedürfnisse). Sie können Ergebnisse auch in der App sortieren.
Wenn die Ergebnisse nicht leer ist, dann aktualisieren Sie (in der App)
lastTimestamp = last_query.last_row.created
(vorausgesetzt, Sie Sortier getan haben, andernfalls nehmen Sie min(last_query.row.created)
)
Wenn die Ergebnisse leer ist, dann wiederholen Sie die Abfrage mit lastTimestamp = lastTimestamp - interval '1 day'
bis Sie etwas holen. Sie müssen auch stoppen, wenn lastTimestamp
zu niedrig wird, d. H. Wenn es niedriger ist als jeder andere Zeitstempel in der Tabelle (der vorab geholt werden muss).
All das ist unter bestimmten Voraussetzungen für Einsätze:
new_row.created >= any_row.created
und
new_row.created ~ current_time
- Die Verteilung der
new_row.created
ist mehr oder weniger einheitliche
Annahme 1 sorgt dafür, dass die Paginierung Ergebnisse in konsistenten Daten, während Annahme 2 nur für das Standarddatum 3000-01-01
benötigt wird. Voraussetzung 3 ist, dass Sie keine großen leeren Lücken haben, wenn Sie viele leere Abfragen absetzen müssen.
Es hat keinen Vorteil, datetime als Integer-Zeitmarke zu speichern. Das macht eigentlich nur die Dinge komplizierter. Stellen Sie sich zum Beispiel eine Abfrage "Gib mir alles seit Anfang des Monats" auf Ganzzahlen vor. Tu es einfach nicht. 'Timestamp' ist genau das, was Sie brauchen, benutzen Sie es. – freakish
@freakish, Danke! Wenn ich Integer hätte, würde ich einfach sagen: SELECT * FROM Tabellenname WHERE erstellt. Aber wenn ich 'timestamptz' benutze, sieht es so aus, als würde ich jedes Element in der Tabelle konvertieren, um sicherzustellen, dass es mindestens ein paar Millisekunden später ist als der angegebene Zeitstempel. Liege ich falsch? –
stkvtflw
Ich bin mir nicht sicher, ob ich das verstehe. 'timestampz' unterstützt' <'operator. Warum würdest du etwas konvertieren? Ich sehe keinen Sinn darin. – freakish