Tabellenstruktur für Zeiträume und Einzeldaten

Tom.S

Fleissiger Benutzer
Beiträge
62
Hallo Forum,
ich muss in mehreren Tabellen Datumsattribute einfügen. Das an sich wäre kein Problem. Ein Problem ist es aber, weil ich Datensätze habe, wo das exakte Datum bekannt ist und andere, wo man es nur grob eingrenzen kann.
Beispiel:

Name | Geboren
Claude Monet | 14.11.1840
Giovanni Antonio Bazzi | 1477
Giacomo della Porta | 1530-1534

Ich möchte Daten aber jetzt einheitlich behandeln. Die erste, aber unschöne Lösung lautet: Es gibt immer zwei Attribute: frühestes_mögliche_datum und spätestes_mögliche_datum. Man speichert also immer den Zeitraum. Kennt man aber das genaue Datum, wird das zweite Feld leer gelassen (oder beide mit dem selben Datum gefüllt). Das unschöne daran ist, dass diese Konvention auch in die Clientsoftware übernommen werden muss, deshalb denke ich mir, dass es auch mit den Mitteln von PostgreSQL eine bessere Lösung geben sollte, z. B. über einen neuen Type.
Da ich damit aber keine nennenswerte Erfahrung habe, hoffe ich auf Eure Tipps.
 
Werbung:
Ja, wäre auch meine Idee hier. Geht ab 9.3.

je nachdem, was die Anwendung 'sehen' soll kann man ja bei der Abfrage(!) einen passenden String erzeigen. Ist das Datum bekannt (Differenz beider Werte kleine 1 Tag) dann gibt man das Datum aus, ansonsten bastelt man sich einen String, der es so darstellt, wie es benötigt wird. In der DB hat man dann immer noch Datumswerte, mit denen man bei Bedarf auch rechnen kann und so ...
 
Werbung:
Mal als Fingerübung:

Code:
test=*# select * from dates ;
 id |  datum
----+-------------------------
  1 | [2015-03-02,2015-03-03)
  2 | [2010-01-01,2016-01-01)
  1 | [2015-03-02,2015-04-03)
(3 rows)

test=*# select * , case when upper(datum) - lower(datum) = 1 then lower(datum)::text when extract(year from upper(datum)) =  extract(year from lower(datum)) then  'gleiches jahr ' || extract(year from upper(datum)) else 'Jahre ' || extract(year from lower(datum))::text || ' - ' || extract(year from upper(datum))::text end from dates;
 id |  datum  |  case
----+-------------------------+--------------------
  1 | [2015-03-02,2015-03-03) | 2015-03-02
  2 | [2010-01-01,2016-01-01) | Jahre 2010 - 2016
  1 | [2015-03-02,2015-04-03) | gleiches jahr 2015
(3 rows)
 
Zurück
Oben