¿Cómo almacenaría una fecha que puede ser parcial (es decir,solo el año, tal vez también el mes) y generarlo más tarde con la misma especificación?

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

Pregunta

Quiero permitir que los usuarios especifiquen una fecha que puede incluir o no un día y un mes (pero que tendrá al menos el año). El problema es cuando se almacena como fecha y hora en la base de datos;el día/mes que falta se guardará como valores predeterminados y perderé el formato original y el significado de la fecha.

Mi idea era almacenar el formato real en una columna como una cadena además de la columna de fecha y hora.Entonces podría usar la columna de cadena siempre que tenga que mostrar la fecha y la fecha y hora para todo lo demás.La desventaja es una columna adicional para cada columna de fecha en la tabla que quiero mostrar, e imprimir fechas localizadas no será tan fácil ya que no puedo confiar en el valor de fecha y hora...Probablemente tendré que analizar la cadena.

Espero haber pasado por alto algo y que pueda haber una manera más fácil.

(Tenga en cuenta que estoy usando Rails si es importante para una solución).

¿Fue útil?

Solución

Según lo propuesto por Jhenzie, cree una máscara de bits para mostrar qué partes de la fecha se han especificado.1 = Año, 2 = Mes, 4 = Día, 8 = Hora (si decides ser más específico) y luego guárdelo en otro campo.

La única manera que se me ocurrió hacerlo sin requerir columnas adicionales en su tabla sería usar el método de jhenzie de usar una máscara de bits y luego almacenar esa máscara de bits en la parte de segundos de su columna de fecha y hora.

Otros consejos

En tu modelo solo presta atención a las partes que te interesan.Por lo tanto, puede almacenar la fecha completa en su base de datos, pero la fusiona antes de mostrársela al usuario.

La columna adicional podría usarse simplemente para especificar qué parte de la fecha y hora se ha especificado

1 = día 2 = mes 4 = año

entonces 3 es día y mes, 6 es mes y año, 7 son los tres.es un int simple en ese punto

Si almacena una cadena, no reinvente parcialmente el estándar ISO 8601 que cubre el caso que describe y más:

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

¿Es realmente necesario almacenarlo como fecha y hora?Si no lo almacenó como una cadena 2008 o 2008-8 o 2008-8-1, divida la cadena en guiones cuando la extraiga y podrá establecer qué tan específica fue la entrada original.

Probablemente almacenaría la fecha y hora y una columna adicional de "precisión" para determinar cómo generarla.Para la salida, la columna de precisión se puede asignar a una columna que contenga la cadena de formato correspondiente ("AAAA-mm", etc.) o puede contener la cadena de formato misma.

No sé mucho sobre el diseño de bases de datos, pero creo que una forma clara de hacerlo sería con columnas booleanas que indiquen si el usuario ha ingresado el mes y el día (una columna para cada uno).Luego, para guardar la fecha indicada, deberás:

  1. Almacene la fecha que el usuario ingresó en una columna de fecha y hora;
  2. Establezca la columna del mes booleano si el usuario ha elegido un mes;
  3. Establezca la columna de día booleano si el usuario ha elegido un día.

De esta manera sabrá en qué partes de la fecha y hora puede confiar (es decir,lo que fue ingresado por el usuario).

Editar:También sería mucho más fácil de entender que tener un int campo con valores crípticos!

La base de datos informix tiene esta facilidad.Cuando define un campo de fecha, también especifica una máscara de los atributos de fecha y hora deseados.Sólo estos campos cuentan al hacer comparaciones.

Con distintos niveles de especificidad, lo mejor que puede hacer es almacenarlos como enteros simples que aceptan valores NULL.Año mes dia.Puede encapsular la lógica de visualización en su modelo de presentación o en un objeto de valor en su dominio.

Los tipos de tiempo integrados representan un instante en el tiempo.Puede usar los tipos integrados y crear una columna para mayor precisión (Año, Mes, Día, Hora, etc.) o puede crear su propia estructura de fechas y usar valores nulos (u otro valor no válido) para las porciones vacías.

Al menos para Ruby, podrías usar esta gema: fecha parcialhttps://github.com/58bits/partial-date

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top