it-swarm.com.de

Wie bekomme ich den letzten Tag des Monats in Postgres?

Wie finde ich den letzten Tag des Monats in Postgres? Ich habe eine Datumsspalte, die als numerisch (18) im Format (JJJJMMTT) gespeichert ist. Ich versuche es mit Datum zu machen

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

dann finde den letzten Tag dieses Datums: so:

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

aber es gibt mir diesen Fehler:

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

Irgendeine Hilfe?

Postgres-Version:

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

Einfach über die Funktion last_day :

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

PS: Ich glaube, Sie wissen, dass es sehr wichtig ist, die richtigen Tags für Ihre eigene Frage auszuwählen!

7
Houari

Für alle, die zu dieser Frage kommen und nach der Postgres - Methode suchen (dies ist nicht der Einsatz von Redshift), gehen Sie wie folgt vor:

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

Ersetzen Sie den '2017-01-05' durch ein beliebiges Datum, das Sie verwenden möchten. Sie können dies zu einer Funktion wie dieser machen:

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

Okay, Sie haben also eine numeric(18)-Spalte mit Zahlen wie 20150118. Sie können das in ein Datum konvertieren wie:

to_date(your_date_column::text, 'YYYYMMDD')

Von einem Datum aus kannst du den letzten Tag des Monats wie:

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

Zusammen würden Sie bekommen:

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

Beispiel bei SQL Fiddle.

2
Andomar

Für zukünftige Suchen akzeptiert Redshift INTERVAL '1 month' nicht. Verwenden Sie stattdessen dateadd(month, 1, date) wie dokumentiert hier .

Um das Ende des Monats zu erhalten, verwenden Sie: DATEADD(DAY, -1, (DATE_TRUNC('month', DATEADD(MONTH, 1, date))))

1
Daniel Evanko

wählen Sie to_char (date_trunc ('Monat', jetzt () + '01 Monate ':: Intervall) - '01 Tage' :: Intervall, 'YYYYmmDD' :: Text) :: numerisch als end_period_n aus

0
Rakesh H B