Pregunta

Necesito almacenar elementos con una fecha del calendario (solo el día, sin hora) en una base de datos sqlite.¿Cuál es la mejor manera de representar la fecha en la columna?Los días julianos y los segundos Unix me vienen a la mente como alternativas razonables.Si voy con una unidad que no sea días ¿a qué hora debería ser?

Actualizar:Conozco ISO8601 y de hecho lo usé para almacenar la fecha como una cadena en formato AAAA-MM-DD para el prototipo.Pero para diversas aritméticas tengo que convertirlo a algún número internamente, por lo que preferiría almacenar un número y simplemente convertirlo en una cadena para mostrarlo.¿En qué unidades debe estar este número, con qué origen y si las unidades son más precisas que los días, qué hora del día se debe utilizar?

¿Fue útil?

Solución

Si espera entregar la fecha a una herramienta o biblioteca externa, debe usar el formato que espere.El tiempo Unix parece ser la lengua franca de la relojería digital, por lo que es un buen valor predeterminado si las circunstancias externas no toman la decisión por usted.

ISO 8601 puede ser de interés.

Editar:

Pero para diversas aritméticas tengo que convertirlo a algún número internamente, por lo que preferiría almacenar un número y simplemente convertirlo en una cadena para mostrarlo.

Ah, eso tiene sentido.Si su entorno (.NET?¿Pitón?C++?) tiene herramientas de manejo del tiempo, sería mejor usar su unidad y época nativas.No hay razón para reescribir todas esas funciones de manipulación de fechas;son más complicados de lo que parecen.De lo contrario, usaría días en el calendario local (¿gregoriano?) Desde una época razonable para su aplicación.Sea generoso, no querrá que se revierta el error del año 2000 cuando de repente necesite manejar una fecha anterior a lo que esperaba.

La hora del día es totalmente una cuestión de gustos.Medianoche parece la opción más limpia (todos ceros en los campos de hora, minutos y segundos), pero como nunca llega al usuario, no tiene implicaciones prácticas.De hecho, sería un buen lugar para un huevo de Pascua.

Otros consejos

Si desea cubrir sus bases, asegúrese de almacenar la fecha en utc y elija un estándar iso.Este enfoque requiere un esfuerzo mínimo y protegerá su código de futuros dolores de cabeza de Interop.Estoy de acuerdo con @skymt ISO 8601 es una buena elección.

Si está utilizando C++, entonces vale la pena echarle un vistazo a boost::date_time.

"Lo mejor" depende casi por completo de dónde provienen las fechas (objetos NSDate, algún feed XML) y cómo se manipulan (simplemente se almacenan tal cual vs.haciendo algo de aritmética como "días hasta").

No necesariamente recomiendo esto, pero escribí una aplicación que también necesitaba almacenar la fecha pero no la hora en una base de datos SQLite.Al principio utilicé dos columnas, Mes y Día, donde Mes se definió como el número de meses desde enero de 2000.Necesitaba imponer una fila por fecha, así que definí un índice ÚNICO en esas dos columnas y resultó que las actualizaciones eran terriblemente lentas.

Para mi segundo intento, utilicé un esquema similar pero codifiqué la fecha en un número, usando los 5 bits inferiores para el Día y los bits superiores restantes para el Mes (nuevamente, desde enero de 2000).Las funciones de conversión fueron:

Date = (Month << 5) | Day
Month = Date >> 5
Day = 0x1F & Date

Este esquema preserva el orden numérico de las fechas y facilita su división en componentes.Tenía sentido para mi aplicación, porque almacenaba datos en porciones mensuales.Si, dada una Fecha, desea encontrar la siguiente Fecha, este esquema podría no ser el mejor, ya que la Fecha + 1 puede no ser una fecha válida.

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