Выбор записей между двумя временными метками - PullRequest
17 голосов
/ 04 января 2012

Я преобразую сценарий Unix с командой транзакции SQL в команду PostgreSQL.

У меня есть таблица с записями, имеющими поле last_update_time (xtime), и я хочу выбрать каждую запись в таблице, которая была обновлена ​​за выбранный период.

Скажем, текущее время 05/01/2012 10:00:00 и выбранное время 04/01/2012 23:55:00. Как выбрать все записи из таблицы, которые были обновлены между этими датами. Я преобразовал 2 раза в секунды в сценарии Unix перед выполнением команды psql и вычислил интервал в секундах между двумя периодами.

Я думал что-то вроде

SELECT A,B,C FROM table
WHERE xtime BETWEEN now() - interval '$selectedtimeParm(in secs)' AND now();

У меня проблемы с оценкой Parm для selectedtimeParm - он не разрешается должным образом.

Примечание редактора: я не изменил неточное использование терминов period, time frame, time и date для типа дата-время timestamp, поскольку я обсуждаю это в своем ответе. 1023 *

1 Ответ

36 голосов
/ 14 января 2012

Что не так с:

SELECT a,b,c
FROM   table
WHERE  xtime BETWEEN '2012-04-01 23:55:00'::timestamp
                 AND now()::timestamp;

Если вы хотите работать с числом секунд как interval:

...
WHERE  xtime BETWEEN now()::timestamp - (interval '1s') * $selectedtimeParm
                 AND now()::timestamp;

Обратите внимание, как яиспользовался стандартный формат даты ISO 8601 YYYY-MM-DD h24:mi:ss, который однозначен для любой локали или DateStyle.

Обратите также внимание, что первое значение для конструкции BETWEEN должно быть меньшим,Если вы не знаете, какое значение меньше, используйте BETWEEN SYMMETRIC.

В своем вопросе вы ссылаетесь на тип даты и времени timestamp как «дата», «время» и «период».В заголовке вы использовали термин «временные рамки», который я изменил на «временные метки».Все эти термины неверны.Свободный обмен ими делает вопрос еще труднее понять.

Это, и тот факт, что вы пометили только вопрос psql (проблема не касается терминала командной строки), может помочь объяснить, почему никто не ответил в течение нескольких дней.,Обычно, это считанные минуты здесь.Мне было трудно понять ваш вопрос, пришлось прочитать его пару раз.

Вам необходимо понять типы данных date, interval, time и timestamp - с или безчасовой пояс.Начните с прочтения главы «Типы даты / времени» в руководстве .

Сообщение об ошибке также могло бы иметь большое значение.

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