web-dev-qa-db-fra.com

Comment obtenir le dernier jour du mois en postgres?

Comment trouver le dernier jour du mois en postgres? J'ai une colonne de date stockée sous forme numérique (18) dans le format (AAAAMMJJ). J'essaie de la date avec l'aide de

to_date("act_dt",'YYYYMMDD') AS "act date"

puis trouvez le dernier jour de cette date: comme ceci:

(select (date_trunc('MONTH',to_date("act_dt",'YYYYMMDD')) + INTERVAL '1 MONTH - 1 day')::date)

mais cela me donne cette erreur:

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]
  -----------------------------------------------

De l'aide?

Version 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

9

Simplement en utilisant la fonction last_day :

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

PS: Maintenant, je pense que vous savez qu'il est très important de choisir les bonnes étiquettes pour votre propre question!

7
Houari

Pour ceux qui viennent à cette question à la recherche de Postgres moyen de le faire (sans utiliser Redshift), voici comment procéder:

SELECT (date_trunc('month', '2017-01-05'::date) + interval '1 month' - interval '1 day')::date
AS end_of_month;

Remplacer le '2017-01-05' par la date que vous souhaitez utiliser. Vous pouvez en faire une fonction comme celle-ci:

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;
21
wspurgin

Bon, vous avez donc une colonne numeric(18) contenant des nombres tels que 20150118. Vous pouvez convertir cela en une date comme:

to_date(your_date_column::text, 'YYYYMMDD')

A partir d'une date, vous pouvez récupérer le dernier jour du mois like:

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

Combinés, vous obtiendriez:

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

Exemple chez SQL Fiddle.

2
Andomar

Pour les recherches futures, Redshift n'accepte pas INTERVAL '1 month'. Utilisez plutôt dateadd(month, 1, date) comme documenté ici .

Pour obtenir la fin du mois, utilisez: DATEADD(DAY, -1, (DATE_TRUNC('month', DATEADD(MONTH, 1, date))))

1
Daniel Evanko

sélectionnez to_char (date_trunc ('mois', maintenant () + '01 mois ':: intervalle) - '01 jours' :: intervalle, 'AAAAMJJJ :: texte) :: numeric as end_period_n

0
Rakesh H B