Permettez-moi de réécrire les choses des commentaires à ma réponse. Vous souhaitez utiliser timestamp
tapez au lieu de integer
simplement parce que c'est exactement pour cela qu'il a été conçu. Faire des conversions manuelles entre les entiers d'horodatage et timestamp
objets est juste une douleur et vous ne gagnez rien. Et vous en aurez éventuellement besoin pour des requêtes plus complexes basées sur la date et l'heure.
Pour répondre à une question sur la pagination. Vous faites simplement une requête
SELECT *
FROM table_name
WHERE created < lastTimestamp
ORDER BY created DESC
LIMIT 30
S'il s'agit de la première requête, vous définissez par exemple lastTimestamp = '3000-01-01'
. Sinon, vous définissez lastTimestamp = last_query.last_row.created
.
Optimisation
Notez que si la table est grande alors ORDER BY created DESC
peut ne pas être efficace (surtout s'il est appelé en parallèle avec différentes plages). Dans ce cas, vous pouvez utiliser des "fenêtres horaires" mobiles, par exemple :
SELECT *
FROM table_name
WHERE
created < lastTimestamp
AND created >= lastTimestamp - interval '1 day'
Le 1 day
l'intervalle est choisi arbitrairement (ajustez-le à vos besoins). Vous pouvez également trier les résultats dans l'application.
Si les résultats ne sont pas vides, vous mettez à jour (dans votre application)
lastTimestamp = last_query.last_row.created
(en supposant que vous avez fait le tri, sinon vous prenez min(last_query.row.created)
)
Si les résultats sont vides, vous répétez la requête avec lastTimestamp = lastTimestamp - interval '1 day'
jusqu'à ce que vous récupériez quelque chose. Aussi, vous devez arrêter si lastTimestamp
devient trop faible, c'est-à-dire lorsqu'il est inférieur à tout autre horodatage de la table (qui doit être prérécupéré).
Tout cela est sous certaines hypothèses pour les insertions :
new_row.created >= any_row.created
etnew_row.created ~ current_time
- La distribution de
new_row.created
est plus ou moins uniforme
L'hypothèse 1 garantit que la pagination donne des données cohérentes tandis que l'hypothèse 2 n'est nécessaire que pour le 3000-01-01
par défaut Date. L'hypothèse 3 consiste à s'assurer que vous n'avez pas de grandes lacunes vides lorsque vous devez émettre de nombreuses requêtes vides.