Как получить последний день месяца в postgres?

Вопрос:Как найти последний день месяца в 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

Вопрос:

Как найти последний день месяца в 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;

Пример в SQL Fiddle.

Ответ №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

Оцените статью
Добавить комментарий