2010-11-29 11 views
5

Trabajando en una aplicación donde nos gustaría que el usuario pueda ingresar fechas incompletas.Estrategia para fechas incompletas

En algunos casos habrá solamente un año - dicen 1854, o puede haber un año y un mes, por ejemplo, de marzo de 1983 o puede haber una fecha completa - 11 de junio de 2001.

Hemos d como un solo atributo/columna de 'fecha' - y para poder ordenar la fecha.

¿Alguna sugerencia?

+0

Si un usuario ingresa "1854", y otro usuario ingresa "2PM 1854", y ordenamos por fecha descendiente, ¿cuál vendrá primero? – RPM1984

+0

¿Cuál es el valor anual más bajo que debe soportar? – jgauffin

Respuesta

8

Almacenar la fecha como un entero - aaaammdd.

entonces usted puede ajustar a cero cualquier componente mes o el día que no se ha entrado

Year only: 1954 => 19540000 
Year & Month: April 2004 => 20040400 
January 1st, 2011 => 20110101 

Por supuesto que estoy asumiendo que usted no necesita almacenar la información en cualquier momento del día.

Posteriormente, se podría crear una estructura para encapsular esta lógica con propiedades útiles que indica qué nivel de detalle se ha establecido, el System.DateTime relevante, etc

Editar: clasificar a continuación, debería funcionar muy bien, así

0

Bueno, podría hacerlo a través de una sola columna y el campo que dice 'IsDateComplete'.

Si sólotiene el campo de fecha, entonces usted necesita para codificar la "incompletitud" en el formato de fecha en sí, de manera que si la fecha es, por ejemplo, < 1900, se considera "incompleta".

Personalmente, me gustaría ir con un campo en el lateral, eso lo marca como tal. Más fácil de seguir, más fácil de tomar decisiones y permite cualquier fecha.

No hace falta decir, tal vez, que solo puede crear una fecha a partir de DateTime.MinValue y luego establecer lo que "sabe".

Por supuesto, mi enfoque no le permite "saber" lo que no sabe. (Es decir, no sabes que han establecido el mes). Quizás puedas usar un especificador de formato de fecha para enmascarar eso y almacenarlo al lado también, pero es potencialmente engorroso.

De todos modos, algunas reflexiones para usted.

0

Una opción es usar enero como el mes predeterminado, 1 como el día predeterminado y 1900 o algo así como el año predeterminado. Las fechas incompletas se rellenarán con los valores predeterminados, y las fechas incompletas se ordenarán antes de completarlas en el mismo año.

Otra opción un poco más compleja es usar -1 para día y año predeterminados, y -1, 'NoMonth', o algo así como el mes predeterminado. Rellene las fechas incompletas como se indica arriba. Esto puede hacer que la clasificación sea un poco difícil dependiendo de cómo lo haga, pero le da una manera de decir qué partes de la fecha son válidas.

0

Sé que preferiría tener 1 columna pero, en lugar de una sola columna, siempre se puede tener una columna por día, mes y año. No es muy difícil hacer consultas en contra, y siempre que cualquiera de los componentes sea nulo.

La codificación de estos estados en el mismo tiempo de fecha será más difícil de consultar.

0

Lo que hice cuando resolví este problema por última vez fue crear un tipo de fecha personalizado que realizara un seguimiento de las partes de fecha realmente configuradas y proporcionó conversiones desde y hacia un DateTime. Para almacenar en la base de datos utilicé un campo de fecha y luego un booleano/bit para mantener un registro de los componentes de fecha que el usuario realmente estableció.

1

No puedo pensar en una buena forma de usar un solo campo de fecha.

Un problema que obtendría si usara enero como el mes predeterminado y 1 como el día predeterminado como otros lo han sugerido, ¿qué sucede cuando en realidad eligen enero? ¿Cómo realizar un seguimiento si se trata de un enero seleccionado o un enero incumplido?

Creo que vas a tener que guardar una máscara junto con la fecha. Solo necesitaría un bit por parte de la fecha, que solo serían 6 bits de datos.

M | D | Y | H | Min | S

Mes Sólo 1 | 0 | 0 | 0 | 0 | 0 = 32

año solo 0 | 0 | 1 | 0 | 0 | 0 = 8

Mes + Año 1 | 0 | 1 | 0 | 0 | 0 = 40

AllButMinSec 1 | 1 | 1 | 1 | 0 | 0 = 60

Se podría poner esto en un Flag Enum para que sea más fácil de usar en el código.

Cuestiones relacionadas