2 Stimmen

Speichern Sie das Datum mit optionalem Monat/Tag

Ich möchte Datum in meiner Postgres-Datenbank speichern.
Das einzige Problem ist, dass dieses Datum optional Tag oder sogar Monat haben kann.

Beispiel:
Der Benutzer gibt den Zeitraum an, in dem er beschäftigt war - nicht unbedingt das vollständige Datum (Tag + Monat + Jahr), sondern nur das Startjahr und das Endjahr.
Es gibt jedoch Benutzer, die nur von Mai bis Oktober im selben Jahr gearbeitet haben, sodass auch der Monat angegeben werden muss.

Wie geht man mit solchen optionalen Datumsangaben um?

3voto

Erwin Brandstetter Punkte 530399

Verwenden Sie auf jeden Fall einen geeigneten Datums-Typ. Speichern Sie nicht Text oder mehrere Spalten. Das wäre teurer und weniger zuverlässig.

Verwenden Sie die Funktion to_date(), die genau Ihren Anforderungen entspricht. Wenn Sie sie beispielsweise mit einem Muster 'YYYYMMDD' aufrufen und der tatsächliche String Zeichen für Tag oder Monat und Tag fehlen, wird auf den ersten Monat / Tag des Jahres / Monats zurückgegriffen:

db=# SELECT to_date('2001', 'YYYYMMDD');
  to_date
------------
 2001-01-01

db=# SELECT to_date('200103', 'YYYYMMDD');
  to_date
------------
 2001-03-01

Sie könnten ein Präzisionsflag speichern, das Jahr / Monat / Tag zusätzlich angibt, wenn Sie das benötigen.

2voto

Basil Bourque Punkte 256611

Während die akzeptierte Antwort gut ist, gibt es eine alternative Möglichkeit.

ISO 8601

Der ISO 8601 Standard definiert sinnvolle Formate für textuelle Darstellungen verschiedener Arten von Datum-Zeit-Werten.

Ein Jahr wird auf die offensichtliche Weise dargestellt, als vierstellige Zahl: 2014

Ein Jahr-Monat wird mit einem erforderlichen Bindestrich dargestellt: 2014-01
Beachten Sie, dass in anderen ISO 8601-Formaten der Bindestrich optional ist. Aber nicht für Jahr-Monat, um Mehrdeutigkeiten zu vermeiden.

Ein vollständiges Datum ist ähnlich: 2014-08-21 oder ohne optionale Bindestriche: 20140821. Ich empfehle, die Bindestriche beizubehalten.

Sie könnten die Werte als Text speichern. Die Länge des Textes würde Ihnen sagen, ob es sich um nur ein Jahr, Jahr-Monat oder Datum handelt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X