Віднімання 1 дня від дати позначки часу


98

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

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

now()Положення породжує подібне повідомлення:

[42883] ПОМИЛКА: оператор не існує: позначка часу з часовим поясом - ціле число Підказка: Жоден оператор не відповідає вказаному імені та типу (аргументам). Можливо, вам доведеться додати відвертий тип лиття. Посада: ...

Інтернет-путівники для типових акторів особливо непотрібні. Вхідні дані оцінені.

Відповіді:


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


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

Функції дати та часу та оператори

тип даних-час (Особливі значення) .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.