Ä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?
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. 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. 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.
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.
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.
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.
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.
Tags und Links postgresql date schema date-of-birth