Come memorizzerei una data che può essere parziale (ad es.solo l'anno, forse anche il mese) e visualizzarlo successivamente con la stessa specificità?

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

Domanda

Voglio consentire agli utenti di specificare una data che può includere o meno un giorno e un mese (ma avrà almeno l'anno). Il problema è quando viene archiviata come data/ora nel DB;il giorno/mese mancante verrà salvato come valore predefinito e perderò il formato e il significato originali della data.

La mia idea era di memorizzare il formato reale in una colonna come stringa oltre alla colonna datetime.Quindi potrei usare la colonna string ogni volta che devo visualizzare la data e il datetime per tutto il resto.Lo svantaggio è una colonna in più per ogni colonna di data nella tabella che desidero visualizzare e stampare le date localizzate non sarà così semplice poiché non posso fare affidamento sul valore datetime...Probabilmente dovrò analizzare la stringa.

Spero di aver trascurato qualcosa e potrebbe esserci un modo più semplice.

(Nota che sto usando Rails se è importante per una soluzione.)

È stato utile?

Soluzione

Come proposto da Jhenzie, crea una maschera di bit per mostrare quali parti della data sono state specificate.1 = Anno, 2 = Mese, 4 = Giorno, 8 = Ora (se decidi di essere più specifico) e poi memorizzarlo in un altro campo.

L'unico modo in cui potevo pensare di farlo senza richiedere colonne aggiuntive nella tabella significherebbe utilizzare il metodo di jhenzie di utilizzare una maschera di bit e quindi archiviare tale maschera di bit nella parte dei secondi della colonna datetime.

Altri suggerimenti

nel tuo modello presta attenzione solo alle parti che ti interessano.Quindi puoi memorizzare l'intera data nel tuo db, ma la unisci prima di visualizzarla all'utente.

La colonna aggiuntiva potrebbe essere utilizzata semplicemente per specificare quale parte della data e dell'ora è stata specificata

1 = giorno 2 = mese 4 = anno

quindi 3 è giorno e mese, 6 è mese e anno, 7 sono tutti e tre.è un semplice int a quel punto

Se memorizzi una stringa, non reinventare parzialmente lo standard ISO 8601 che copre il caso che descrivi e altro ancora:

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

È davvero necessario memorizzarlo come data e ora?Se non lo hai memorizzato come stringa 2008 o 2008-8 o 2008-8-1: dividi la stringa sui trattini quando la estrai e sarai in grado di stabilire quanto fosse specifico l'input originale

Probabilmente memorizzerei il datetime e un'ulteriore colonna "precisione" per determinare come visualizzarlo.Per l'output, la colonna di precisione può essere mappata a una colonna che contiene la stringa di formattazione corrispondente ("AAAA-mm", ecc.) oppure può contenere la stringa di formattazione stessa.

Non so molto sulla progettazione del DB, ma penso che un modo pulito per farlo sarebbe con colonne booleane che indicano se l'utente ha immesso mese e giorno (una colonna per ciascuna).Quindi, per salvare la data specificata, dovresti:

  1. Memorizza la data immessa dall'utente in una colonna datetime;
  2. Imposta la colonna booleana del mese se l'utente ha scelto un mese;
  3. Imposta la colonna del giorno booleano se l'utente ha scelto un giorno.

In questo modo sai di quali parti del datetime ti puoi fidare (ad es.cosa è stato inserito dall'utente).

Modificare:sarebbe anche molto più facile da capire che avere un file int campo con valori criptici!

Il database informix dispone di questa funzionalità.Quando definisci un campo data, specifichi anche una maschera degli attributi di data e ora desiderati.Solo questi campi contano quando si eseguono i confronti.

Con diversi livelli di specificità, la soluzione migliore è memorizzarli come semplici valori nullable.Anno mese giorno.Puoi incapsulare la logica di visualizzazione nel tuo modello di presentazione o in un oggetto valore nel tuo dominio.

I tipi di tempo incorporati rappresentano un istante nel tempo.È possibile utilizzare i tipi incorporati e creare una colonna per la precisione (anno, mese, giorno, ora, ecc.) oppure è possibile creare la propria struttura di data e utilizzare valori null (o un altro valore non valido) per le parti vuote.

Almeno per il rubino, ti potrebbe servire questa gemma, con data parzialehttps://github.com/58bits/partial-date

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top