Запрос PostgreSQL за текущую минуту - PullRequest
1 голос
/ 05 августа 2010

Мое веб-приложение должно получать результаты всех элементов, которые имеют значение времени для этой минуты.Моя таблица имеет атрибуты времени

id, message, time, ...,

, где время имеет тип отметки времени с часовым поясом.Мне нужно получить список всех записей, где время является текущей минутой.Сравнение всего значения не совпадает, поскольку метка времени имеет микросекундное разрешение.

В настоящее время я использую следующий запрос, чтобы вернуть этот список, и он работает, но я думаю, что должен быть более эффективный способ сделать это.

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);

Я также хотел бы знать, как получить результаты для текущей и предыдущей минут или последних 'n' минут.База данных PostgreSQL 8.4.3

Спасибо

Ответы [ 2 ]

3 голосов
/ 05 августа 2010

Я бы попробовал что-то вроде этого:

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

Это определит границы и выполнит поиск времен в этом диапазоне, что означает, что он все еще может использовать индекс, который у вас есть (или должен быть) в столбце time.

2 голосов
/ 05 августа 2010

Как насчет простого сравнения усеченных временных меток?

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

Я сомневаюсь, что оптимизатор достаточно умен, чтобы использовать индекс для столбца time, используя этот подход.Если у вас есть такой индекс, то вам, вероятно, следует воспользоваться предложением Лукаша Лалинского, если вы хотите повысить производительность.Зависит от того, сколько данных у вас есть на самом деле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...