Wie speichert man Geburtstage ohne Jahreszahl?

8

Ähnliche Frage: Geburtstage von Postgres

Wir entwickeln ein neues Feature: Wir speichern die Monats- und Tagesabschnitte der Geburtstage der Menschen, aber nicht das Jahr. Ein an Weihnachten geborener Benutzer hat also den Geburtstag "12/25". Die Frage ist, wie können wir das in Postgres am besten darstellen?

  1. Die Spalte date benötigt ein Jahr und lehnt auch Schalttage in Nicht-Schaltjahren ab. Wir könnten alle Geburtstage mit einem beliebigen Schaltjahr speichern, z. '1972-12-25' , aber das wäre ein bisschen ein Klud.
  2. Wir könnten zwei int -Spalten verwenden, eine für Monat und eine für Jahr, aber wir würden die eingebaute Datumsprüfung von pg komplett verlieren und Sie könnten das Datum '02-31' speichern.
  3. Wir könnten eine einzelne Spalte text verwenden, aber die Abfrage dagegen wäre nicht schön.

Gibt es irgendwelche Optionen, die uns fehlen? Wir sind derzeit auf ein paar Integer-Spalten gelehnt.

Bearbeiten:

  

Warum speichern Sie nicht nur das Geburtsdatum - das ein gültiges Datum sein muss - und   gehst du von dort?

Datenschutz - Dies ist eine optionale Funktion, und wir möchten nicht mehr persönliche Informationen als nötig anfordern.

    
Frank Farmer 10.10.2011, 23:16
quelle

3 Antworten

7

Speichern Sie einfach das Datum mit einem beliebigen Schaltjahr und formatieren Sie es bei Bedarf in SELECTs.
Ich habe eine Reihe von Fällen, wo ich genau das mache. Es ist so viel einfacher als all die anderen Ideen.

Aktualisierung nach dem Bearbeiten der Frage

Wenn das Geburtsjahr optional ist, hat ein Datum den zusätzlichen Vorteil, dass Sie das Jahr speichern können, wenn Sie es haben - in denselben 4 Bytes eine Datumsspalte braucht. Verwenden Sie ein beliebiges Schaltjahr, das bei Datumsangaben ohne Jahresangabe unmöglich ist. Wie 2400 oder 1804.

    
Erwin Brandstetter 10.10.2011 23:21
quelle
3

Da Ihnen die üblichen Postgres-Datumsfunktionen ohnehin nicht wirklich helfen, scheint es am besten, Monat und Tag als Integer-Spalten zu speichern. Sie können das Datum nicht mehr validieren, als zu überprüfen, dass der Tag die maximale Anzahl an Tagen im angegebenen Monat nicht überschreitet (wenn der Benutzer am 29. Februar eintritt, können Sie nicht wirklich mit ihm argumentieren).

Wenn Sie Bedenken hinsichtlich der Gültigkeit der Daten haben, könnten Sie das Monat / Tag-Paar als Fremdschlüssel in eine Tabelle einfügen, die 366 Zeilen speichert, eine für jedes gültige Monat / Tag-Paar.

Sie müssen möglicherweise noch mit dem 29. Februar fertig werden, wenn Sie beispielsweise Geburtstagsgrüße an einen Benutzer senden.

    
Greg Hewgill 10.10.2011 23:25
quelle
0

Dies ist eher eine clientseitige Validierung.

Früher haben wir Benutzern eine Liste von Monaten und Tagen angeboten.

Überprüfen Sie es vor dem Senden des Formulars.

Speichern Sie es in einer Tabelle als einzelne String-Spalte, die indiziert ist.

Jeden Tag scannt ein Cron-Job alle gültigen Einträge, die als heutige Tag / Monat-Kombination fallen, und sendet Grüße an ihre Mailbox je nach Art der Veranstaltung (Jahrestag oder Geburtstag) etc.

    
arvind 11.10.2011 13:03
quelle