Як додати кількість днів у postgresql datetime


79

У мене є наступна таблиця projects.

id title        created_at                     claim_window
1  Project One  2012-05-08 13:50:09.924437     5
2  Project Two  2012-06-01 13:50:09.924437     10

А) Я хочу знайти дедлайн із розрахунком deadline = created_at + claim_window(No. of days).

Щось на зразок наступних.

id title        created_at                     claim_window deadline
1  Project One  2012-05-08 13:50:09.924437     5            2012-05-13 13:50:09.924437
2  Project Two  2012-06-01 13:50:09.924437     10           2012-06-11 13:50:09.924437

B] Я також хочу знайти проекти, термін яких закінчився

id title        created_at                     claim_window deadline
1  Project One  2012-05-08 13:50:09.924437     5            2012-05-13 13:50:09.924437

Я намагаюся щось на зразок наступного.

SELECT * FROM "projects" WHERE (DATE_PART('day', now()- created_at) >= (claim_window+1))

Але з якихось причин це не працює.

Відповіді:


134

Це дасть вам крайній термін:

select id,  
       title,
       created_at + interval '1' day * claim_window as deadline
from projects

В якості альтернативи функцію make_intervalможна використовувати:

select id,  
       title,
       created_at + make_interval(days => claim_window) as deadline
from projects

Щоб отримати всі проекти, де термін закінчився, використовуйте:

select *
from (
  select id, 
         created_at + interval '1' day * claim_window as deadline
  from projects
) t
where localtimestamp at time zone 'UTC' > deadline

але виникає ще одна проблема, мій created_at має тип даних timestamp without time zoneІ current_timestamp має тип даних timestamp with time zone, отже, я не отримую правильної відповіді
Саліл

@Salil: LOCALTIMESTAMPis atimestamp without time zone
a_horse_with_no_name

@Salil: Це також не має значення, результат буде однаковим з будь-яким timestampабо timestamptz, якщо дані посилаються на той самий момент часу. Додавання дня має однаковий ефект для обох.
Ервін Брандштеттер

мій create_at зберігається в часі UTC (без часового поясу), а LOCALTIMESTAMP & CURRENT_TIMESTAMP дає мені час у +5.30, отже, проблему все ще не вирішити
Саліл,

@Salil: потім повторно обчислити місцеву мітку часу до utc, використовуючиlocaltimestamp at time zone 'UTC'
a_horse_with_no_name

17

Для мене мені довелося розмістити весь інтервал в одинарні лапки, а не лише значення інтервалу.

select id,  
   title,
   created_at + interval '1 day' * claim_window as deadline from projects   

Замість

select id,  
   title,
   created_at + interval '1' day * claim_window as deadline from projects   

Функції дати / часу Postgres

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