/ / Zapytanie PostgreSQL dla bieżącej minuty - sql, postgresql, jdbc

Zapytanie PostgreSQL dla bieżącej minuty - sql, postgresql, jdbc

Moja aplikacja internetowa musi uzyskać wyniki wszystkich elementów, które mają swoją wartość czasu dla tej minuty. Moja tabela ma atrybuty czasu

id, message, time, ...,

gdzie czas jest typu znacznik czasu ze strefą czasową. Muszę uzyskać listę wszystkich wpisów, w których czas jest bieżącą minutą. Porównywanie całej wartości nie jest zgodne, ponieważ znacznik czasu ma rozdzielczość w mikrosekundach.

Obecnie używam następującego zapytania, aby zwrócić tę listę i działa, ale myślę, że powinien istnieć skuteczniejszy sposób robienia tego.

SELECT * FROM notification WHERE
date_part("year", time) = date_part("year", current_date) AND
date_part("month", time) = date_part("month", current_date) AND
date_part("day", time) = date_part("day", current_date) AND
date_part("hour", time) = date_part("hour", current_time) AND
date_part("minute", time) = date_part("minute", current_time);

Chciałbym również wiedzieć, jak uzyskać wyniki za tę i ostatnią minutę lub za ostatnie "n" minuty. Baza danych to PostgreSQL 8.4.3

Dzięki

Odpowiedzi:

3 dla odpowiedzi № 1

Chciałbym spróbować czegoś takiego:

WHERE
time >= date_trunc("minute", now()) AND
time < date_trunc("minute", now()) + INTERVAL "1 minute";

Spowoduje to zdefiniowanie granic i wyszukiwanie czasów w tym zakresie, co oznacza, że ​​nadal może używać indeksu, który masz (lub powinien mieć) na time kolumna.


2 dla odpowiedzi nr 2

A co z prostym porównywaniem skróconych znaczników czasu?

SELECT *
FROM notification n
WHERE date_trunc("minute", n.time) = date_trunc("minute", current_timestamp);

Wątpię, czy optymalizator jest wystarczająco inteligentny, aby użyć indeksu na time kolumna wykorzystująca to podejście. Jeśli posiadasz taki indeks, prawdopodobnie powinieneś użyć sugestii Lukáša Lalinskiego, jeśli chcesz mieć lepszą wydajność. Zależy, ile naprawdę masz danych.