2015-01-28 5 views
4

Как найти последний день месяца в postgres? У меня есть дата столбцы хранятся в виде числовой (18) в формате (YYYYMMDD) Я пытаюсь это сделать дату, используяКак получить последний день месяца в postgres?

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

+0

'to_date' преобразует только строки в даты. Если ваша колонка содержит значения эпохи Unix, вам нужно использовать 'to_timestamp':' to_timestamp (act_dt) :: date'. –

+0

@ AudriusKažukauskas: \t ОШИБКА: функция to_timestamp (числовая) не существует. Подсказка: никакая функция не соответствует указанному имени и типам аргументов. Возможно, вам придется добавлять явные типы. ? –

+0

'to_timestamp' ожидает двойной тип точности, попробуйте добавить к нему свой столбец:' to_timestamp (act_dt :: float8) :: date'. Кстати, не могли бы вы подтвердить, что в этом столбце хранятся значения времени эпохи Unix? Если это не так, вы должны указать в своем вопросе, что именно он хранит. –

ответ

4

Просто используя функцию last_day:

select last_day(to_date(act_date,'YYYYMMDD')) 

PS: Теперь я считаю, что вы знаете, что очень важно правильно выбрать теги для вашего собственного вопроса!

+0

'ОШИБКА: значения интервалов с месячными или годовыми частями не поддерживаются Деталь: -------------------------------- --------------- ошибка: значения интервалов с месяцами или годами не поддерживаются код: 8001 контекст: интервал месяцев: "1" запрос: 674275' любая помощь? –

+2

@HareRamaHareKrishna: какова ваша точная версия Postgres? Измените свой вопрос и добавьте вывод 'select version()' к вашему вопросу. –

+0

@a_horse_with_no_name: спасибо обновлено. –

1

Хорошо, так что у вас есть numeric(18) столбца, содержащего число, как 20150118. Вы можете конвертировать, что к дате, как:

to_date(your_date_column::text, 'YYYYMMDD') 

С даты, вы можете захватить the last day of the month как:

(date_trunc('month', your_date_column) + 
    interval '1 month' - interval '1 day')::date; 

Combined, вы получите:

select (date_trunc('month', to_date(act_dt::text, 'YYYYMMDD')) + 
      interval '1 month' - interval '1 day')::date 
from YourTable; 

Example at SQL Fiddle.

+1

Andomar: Now() - это моя «целая дата», нужно сделать ее датой, а затем использовать ее вместо now() .. что-то вроде этого не работает '(select (date_trunc ('MONTH', to_date (" act_dt " , 'YYYYMMDD')) + INTERVAL '1 MONTH - 1 day') :: date), это дает мне ошибку, как указано выше ' –

+0

@HareRamaHareKrishna: это было очевидно из вашего вопроса, извините. Обновлен ответ. – Andomar

+0

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

0

Для будущих поисков Redshift не принимает INTERVAL '1 month'. Вместо этого используйте dateadd(month, 1, date), как описано в документе here.

Чтобы получить конец месяца использования: DATEADD(DAY, -1, (DATE_TRUNC('month', DATEADD(MONTH, 1, date))))

3

Для кого подходит к этому вопросу ищет 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; 
0

выберите to_char (date_trunc ('месяц', сейчас() 'интервал ::) - '01 дней' + '01 месяцев интервал :: 'YYyyMmDd' :: text) :: numeric as end_period_n

Смежные вопросы