Wie würde ich ein Datum speichern, die teilweise sein können (das heißt nur das Jahr, vielleicht auch der Monat) und gibt es später mit der gleichen Spezifität?

StackOverflow https://stackoverflow.com/questions/90246

Frage

Ich mag Benutzer lassen, ein Datum angeben, das nicht einen Tag und den Monat umfassen kann oder auch (aber wird das Jahr zumindest.) Das Problem ist, wenn es als Datum in der DB gespeichert ist; der fehlende Tag / Monat wird als Standardwert gespeichert werden, und ich werde das ursprüngliche Format und die Bedeutung des Datums verlieren.

war meine Idee, das Real-Format in einer Spalte als Zeichenkette zusätzlich zu der Datetime-Spalte zu speichern. Dann könnte ich die String-Spalte verwenden, wenn ich das Datum angezeigt haben und die Datetime für alles andere. Der Nachteil ist, eine zusätzliche Spalte für jede Datumsspalte in der Tabelle I angezeigt werden soll, und den Druck lokalisierte Daten werden nicht so einfach, da ich nicht auf dem Datetime-Wert verlassen kann ... Ich werde wahrscheinlich die Zeichenfolge analysieren muß .

Ich hoffe, ich habe etwas übersehen und es könnte ein einfacher Weg sein.

(Anmerkung Ich bin mit Rails, wenn es für eine Lösung wichtig ist.)

War es hilfreich?

Lösung

Wie Jhenzie vorgeschlagen, erstellen Sie eine Bitmaske zu zeigen, welche Teile des Datums angegeben wurden. 1 = Jahr, 2 = Monat, 4 = Tag, 8 = Stunde (wenn Sie sich entscheiden, präziser zu bekommen) und dann speichern, dass in ein anderes Feld.

Der einzige Weg, dass ich es zu tun denken konnte, ohne erfordern zusätzliche Spalten in der Tabelle wäre jhenzie Methode der Verwendung einer Bitmaske zu verwenden und dann zu speichern, die in den Sekunden Teil Ihrer Datetime-Bitmaske Spalte.

Andere Tipps

in Ihrem Modell zahlen nur die Aufmerksamkeit auf die Teile, die Sie interessieren. So können Sie den gesamten Tag in Ihrem db speichern, aber Sie es sich vereinigen, bevor sie dem Benutzer angezeigt wird.

Die zusätzlichen Spalt einfach verwendet werden könnten, für die Angabe, welcher Teil der Datums Zeit angegeben wurde

1 = Tag 2 = Monat 4 = Jahr

so sind 3 Tage und Monate, 6 Monate und Jahre, 7 alle drei. es ist eine einfache int an diesem Punkt

Wenn Sie eine Zeichenfolge speichern, nicht teilweise ISO 8601 Standard neu zu erfinden, die den Fall abdeckt Sie beschreiben, und mehr:

http://en.wikipedia.org/wiki/ISO_8601

Ist es wirklich notwendig, es als Datum zu speichern überhaupt? Wenn es nicht als String gespeichert 2008 oder 2008-8 oder 2008.08.01 - teilen Sie die Zeichenfolge auf Bindestriche, wenn Sie es herausziehen und du bist in der Lage festzustellen, wie spezifisch das ursprüngliche Eingangs war

Ich würde wahrscheinlich das Datumzeit speichern und eine zusätzliche „Präzision“ Spalte, um zu bestimmen, wie es ausgegeben wird. Für die Ausgabe kann die Genauigkeit Spalte mit einer Spalten Karte, die die entsprechenden Formatierungs Zeichenfolge ( „YYYY-mm“, usw.) enthält, oder sie kann die Formatierungs String selbst enthalten.

Ich weiß nicht viel über DB-Design, aber ich denke, eine saubere Art und Weise, es zu tun mit boolean Spalten wäre das anzeigt, ob die Benutzereingabe Monat und Tag hat (eine Spalte für jeden). Dann, um das angegebene Datum zu speichern, würden Sie:

  1. Speichern Sie das Datum, das die Benutzereingabe in einer Datetime-Spalte;
  2. Geben Sie die Booleschen Monat Spalte, wenn der Benutzer einen Monat ausgewählt hat;
  3. Geben Sie den Booleschen Tag Spalte, wenn der Benutzer einen Tag gepflückt hat.

Auf diese Weise wissen Sie, welche Teile des Datetime können Sie darauf vertrauen (das heißt, was vom Benutzer eingegeben).

Edit: es wäre auch viel leichter zu verstehen als mit kryptischen Werten ein int Feld mit

Die Informix-Datenbank hat diese Möglichkeit. Wenn Sie ein Datumsfeld definieren geben Sie auch eine Maske der gewünschten Zeit und Datum Attribute. Nur zählen diese Felder, wenn Vergleiche zu tun.

Mit unterschiedlichen Ebenen der Spezifität, die beste Wahl ist, sie so einfach auf NULL festlegbare ints zu speichern. Jahr Monat Tag. Sie können die Anzeigelogik in Ihrem Präsentationsmodell oder ein Wert Objekt in Ihrer Domäne kapseln.

Built-In-Typ einen Zeitpunkt darstellen. Sie können die eingebauten Typen verwenden und eine Spalte für Präzision (Jahr, Monat, Tag, Stunde, etc.) erstellen oder Sie können Ihr eigenes Datum Struktur und verwenden Nullen (oder einen anderen ungültigen Wert) für leere Abschnitte erstellen.

Für Rubin zumindest - Sie dieses Juwel verwenden kann - teilweise aktuell https://github.com/58bits/partial-date

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top