Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Tabellenstruktur für Zeiträume und Einzeldaten

Dieses Thema im Forum "PostgreSQL" wurde erstellt von Tom.S, 2 März 2015.

  1. Tom.S

    Tom.S Fleissiger Benutzer

    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.
     
  2. Distrilec

    Distrilec Datenbank-Guru

    Bringt Postgre nicht ein "Daterange" Typen mit... oder irre ich mich gerade?
     
  3. akretschmer

    akretschmer Datenbank-Guru

    Ja, wäre auch meine Idee hier. Geht ab 9.3.
     
  4. akretschmer

    akretschmer Datenbank-Guru

    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 ...
     
  5. akretschmer

    akretschmer Datenbank-Guru

    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)
    
     
    Distrilec gefällt das.
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden