Este dilema se puede abordar de diferentes maneras, sin embargo te mostramos la solución más completa en nuestra opinión.
Solución:
Para cualquiera que llegue a esta pregunta buscando el postgres manera de hacer esto (sin usar Redshift), así es como lo haría:
SELECT (date_trunc('month', '2017-01-05'::date) + interval '1 month' - interval '1 day')::date
AS end_of_month;
Reemplazo de la '2017-01-05'
con la fecha que quieras usar. Puedes convertir esto en una función como esta:
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;
Simplemente usando la función last_day:
select last_day(to_date(act_date,'YYYYMMDD'))
PD: Ahora, creo que sabes que es muy importante elegir las etiquetas correctas para tu propia pregunta.
Bien, entonces tienes un numeric(18)
columna que contiene números como 20150118
. Puede convertir eso en una fecha como:
to_date(your_date_column::text, 'YYYYMMDD')
A partir de una fecha, puede tomar el último día del mes como:
(date_trunc('month', your_date_column) +
interval '1 month' - interval '1 day')::date;
Combinado, obtendrías:
select (date_trunc('month', to_date(act_dt::text, 'YYYYMMDD')) +
interval '1 month' - interval '1 day')::date
from YourTable;
Ejemplo en SQL Fiddle.
Si para ti ha resultado útil este post, agradeceríamos que lo compartas con otros entusiastas de la programación de esta manera nos ayudas a dar difusión a nuestro contenido.