Sep 26

PostgreSQL: Mit date_part ein Datum zusammen setzen

Meine Problemstellung war diese:
In einer Tabelle sind Timestamps gespeichert. Diese möchte ich in einer Abfrage (ungern mit einer Function) auf Datumsangaben reduzieren und danach gruppieren. Die Tabelle sieht so aus:

CREATE TABLE public.tabelle (
  id SERIAL, 
  timestamp_event TIMESTAMP(0) WITHOUT TIME ZONE, 
  CONSTRAINT tabelle_pkey PRIMARY KEY(id)
) WITHOUT OIDS;

Grundsätzlich lässt sich mit PostgreSQL entweder über extract() oder mit date_part() arbeiten (s. dazu www.postgresql.org/docs/8.3/static/functions-datetime.html). Allerdings lässt sich hier nicht automatisch ein ganzes Datum(im Sinne von „01.04.2012“ sondern nur ein Tag („01“), ein Monat („04“) und ein Jahr („2012“) getrennt ermitteln. Wie bekomme ich das zusammen?

Meine Lösung:
Die einzelnen Datumsbestandsteile lassen sich mit || verketten. Mit ||‘.’|| wird daraus sogar etwas, was wie ein Datum aussieht (aber keines ist, sondern ein String!). Für meinen Anwendungszweck ist das aber vollkommen ausreichend. Das ganze sieht dann so aus:

SELECT 
count(t.id) as anzahl,
date_part('day', t.timestamp_event)||'.'||date_part('month', t.timestamp_event)||'.'||date_part('year', t.timestamp_event) as datum
from tabelle t
group by datum, anzahl
order by 1 DESC, 2 DESC

Vielleicht spart es ja jemandem ein paar Minuten Suche.