Запрос помощи с запросом postgresql - PullRequest
0 голосов
/ 01 июня 2011

Привет всем.Вот моя ситуация ... Мне нужно создать SQL-запрос к серверу postgresql, который будет возвращать все записи, созданные за последние 5 минут, с округлением до самой низкой минуты.Поэтому, если cron запускает запрос в 12: 05: 25.000, он должен запросить все записи, созданные с 12: 00: 00.000.Так что, думаю, у меня действительно есть две проблемы.

Вот текущий запрос:

select * from callhistory where created>date_trunc('minute', timestamp (current_timestamp-interval '5' minute));

Он ничего не возвращает.Кроме того, формат созданного поля: «2011-05-18 18: 11: 32.024.»

Любая помощь будет принята.

Ответы [ 2 ]

2 голосов
/ 01 июня 2011

Синтаксис: date_trunc немного отключен:

select *
from callhistory
where created > date_trunc('minute', current_timestamp - interval '5' minute)

Вы также можете использовать now() вместо current_timestamp:

select *
from callhistory
where created > date_trunc('minute', now() - interval '5' minute)

И пример:

=> create table stuff (created timestamp not null);
=> insert into stuff (created) values (current_timestamp);
-- Wait a could seconds...
=> insert into stuff (created) values (current_timestamp);
=> select * from stuff where created > date_trunc('minute', current_timestamp - interval '5' minute);
          created           
----------------------------
 2011-06-01 11:32:55.672027
 2011-06-01 11:33:00.182953
=> select * from stuff where created > date_trunc('minute', current_timestamp - interval '7' day);
          created           
----------------------------
 2011-06-01 11:32:55.672027
 2011-06-01 11:33:00.182953

ОБНОВЛЕНИЕ : похоже, что PostgreSQL версии 8 немного строже в формате для interval, в подробном руководстве сказано, что вы должны использовать interval '$n $unit', где $n количество вещей и $unit - единица времени. Версия 9 позволяет вам говорить interval '$n' $unit без жалоб, но версия 8 преобразует ваш интервал в 0, если вы не используете документированный формат. Таким образом, вы должны использовать это как для версии 8, так и для версии 9:

select *
from callhistory
where created > date_trunc('minute', current_timestamp - interval '5 minute')
0 голосов
/ 02 июня 2011

Вот пример теста, который я провел на сервере PostgreSQL 8.3. Вы не упомянули версию, которую вы используете.

select current_timestamp, to_char((current_timestamp - '5 minutes'::interval), 'yyyy-mm-dd HH:mi:00')::timestamp;

Интервал вычитает 5 минут, а метод to_char () округляется до ближайшей минуты. Если это то, что вы ищете, то запрос должен выглядеть следующим образом:

select * from callhistory where created > to_char((current_timestamp - '5 minutes'::interval), 'yyyy-mm-dd HH:mi:00')::timestamp
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...