Вычитание 1 дня с даты отметки времени

Я использую Datagrip для Postgresql. У меня есть таблица с полем даты в формате timestamp (ex: 2016-11-01 00:00:00). Я хочу иметь возможность:

  • применить математический оператор для вычитания 1 дня
  • фильтровать его на основе сегодняшнего времени-130 дней
  • отобразить его без части hh/mm/ss штампа (2016-10-31)

Текущий начальный запрос:

select org_id, count(accounts) as count, ((date_at) - 1) as dateat 
from sourcetable 
where  date_at <= now() - 130
group by org_id, dateat

Предложение ((date_at)-1) в строке 1 приводит к:

[42883] ОШИБКА: оператора не существует: временная метка без часового пояса - integer Подсказка: оператор не соответствует указанному имени и типу аргументов. Возможно, вам придется добавлять явные типы. Позиция: 69

В предложении now() появляется аналогичное сообщение:

[42883] ОШИБКА: оператор не существует: отметка времени с часовым поясом - integer Подсказка: оператор не соответствует указанному имени и типу аргументов. Возможно, вам придется добавлять явные типы. Позиция:...

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

Ответ 1

Используйте для этого тип INTERVAL. Например:

--yesterday
SELECT NOW() - INTERVAL '1 DAY';

--Unrelated to the question, but PostgreSQL also supports some shortcuts:
SELECT 'yesterday'::TIMESTAMP, 'tomorrow'::TIMESTAMP, 'allballs'::TIME;

Затем вы можете сделать следующее по вашему запросу:

SELECT 
    org_id,
    count(accounts) AS COUNT,
    ((date_at) - INTERVAL '1 DAY') AS dateat
FROM 
    sourcetable
WHERE 
    date_at <= now() - INTERVAL '130 DAYS'
GROUP BY 
    org_id,
    dateat;


СОВЕТЫ

Совет 1

Вы можете добавить несколько операндов. Например: как получить последний день текущего месяца?

SELECT date_trunc('MONTH', CURRENT_DATE) + INTERVAL '1 MONTH - 1 DAY';

Совет 2

Вы также можете создать интервал, используя функцию make_interval, которая полезна, когда вам нужно создать его во время выполнения (без использования литералов):

SELECT make_interval(days => 10 + 2);
SELECT make_interval(days => 1, hours => 2);
SELECT make_interval(0, 1, 0, 5, 0, 0, 0.0);


Дополнительная информация:

Функции даты и времени и операторы

тип-дата-время (особые значения).