Вопрос:
Как найти последний день месяца в postgres?
У меня есть столбцы даты, которые хранятся как числовые (18) в формате (YYYYMMDD)
Я пытаюсь сделать это с помощью
to_date(«act_dt»,’YYYYMMDD’) AS «act date»
затем найдите последний день этой даты:
например:
(select (date_trunc(‘MONTH’,to_date(«act_dt»,’YYYYMMDD’)) + INTERVAL ‘1 MONTH — 1 day’)::date)
но он дает мне эту ошибку:
ERROR: Interval values with month or year parts are not supported Detail: ———————————————— error: Interval values with month or year parts are not supported code: 8001 context: interval months: «1» query: 673376 location: cg_constmanager.cpp:145 process: padbmaster [pid=20937] ————————————————
Любая помощь?
Версия для Postgres:
PostgreSQL 8.0.2 on i686-pc-linux-gnu, compiled by GCC gcc (GCC) 3.4.2 20041017 (Red Hat 3.4.2-6.fc3), Redshift 1.0.874
Лучший ответ:
Просто используя last_day:
select last_day(to_date(act_date,’YYYYMMDD’))
PS: Теперь я считаю, что вы знаете, что очень важно выбирать правильные теги для своего вопроса!
Ответ №1
Для любого, кто подходит к этому вопросу, ищет способ Postgres сделать это (не используя Redshift), вот как вы это сделаете:
SELECT (date_trunc(‘month’, ‘2017-01-05’::date) + interval ‘1 month’ — interval ‘1 day’)::date AS end_of_month;
Замена ‘2017-01-05’ любой датой, которую вы хотите использовать. Вы можете сделать это так:
create function end_of_month(date) returns date as $$ select (date_trunc(‘month’, $1) + interval ‘1 month’ — interval ‘1 day’)::date; $$ language ‘sql’ immutable strict; Ответ №2
Итак, у вас есть столбец numeric(18), содержащий числа, такие как 20150118. Вы можете преобразовать его в дату, например:
to_date(your_date_column::text, ‘YYYYMMDD’)
С даты вы можете захватить последний день месяца, например:
(date_trunc(‘month’, your_date_column) + interval ‘1 month’ — interval ‘1 day’)::date;
В сочетании, вы получите:
select (date_trunc(‘month’, to_date(act_dt::text, ‘YYYYMMDD’)) + interval ‘1 month’ — interval ‘1 day’)::date from YourTable;
Ответ №3
Для будущих поисков Redshift не принимает INTERVAL ‘1 month’. Вместо этого используйте dateadd(month, 1, date), как описано здесь.
Чтобы использовать конец месяца: DATEADD(DAY, -1, (DATE_TRUNC(‘month’, DATEADD(MONTH, 1, date))))
Ответ №4
выберите to_char (date_trunc (‘month’, now() + ’01 Months ‘:: interval) – ’01 Days’:: interval, ‘YYYYmmDD’:: text):: numeric as end_period_n