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

98

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

  1. применить математический оператор, чтобы вычесть 1 день
  2. фильтровать по временному окну сегодня - 130 дней
  3. отображать его без части штампа чч / мм / сс (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] ОШИБКА: оператор не существует: метка времени без часового пояса - целое число Подсказка: ни один оператор не соответствует заданному имени и типу (-ам) аргумента. Возможно, вам потребуется добавить явное приведение типов. Результат: 69

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

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

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

J-Ko
источник

Ответы:

226

Используйте для этого 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);


Больше информации:

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

datatype-datetime (особые значения) .

Мишель Милецци
источник