Estoy creando aplicaciones de Android y necesito guardar la fecha / hora del registro de creación. Los documentos de SQLite dicen, sin embargo, "SQLite no tiene una clase de almacenamiento reservada para almacenar fechas y / o horas" y es "capaz de almacenar fechas y horas como valores TEXT, REAL o INTEGER".
¿Existe una razón técnica para utilizar un tipo sobre otro? ¿Y puede una sola columna almacenar fechas en cualquiera de los tres formatos de fila a fila?
Tendré que comparar las fechas más tarde. Por ejemplo, en mis aplicaciones mostraré todos los registros que se crean entre la fecha A y la fecha B. Me preocupa que no tener una verdadera columna DATETIME pueda dificultar las comparaciones.
Respuestas:
SQlite no tiene un tipo de fecha y hora específico. Puede utilizar
TEXT
,REAL
oINTEGER
escribir, lo que se adapte a sus necesidades.Directamente del DOCS
Las funciones de fecha y hora integradas de SQLite se pueden encontrar aquí .
fuente
Habiendo dicho eso, usaría INTEGER y almacenaría segundos desde la época de Unix (1970-01-01 00:00:00 UTC).
fuente
RSQLite
parece que se está convirtiendoPOSIXct
a una época numérica, por lo que funciona bastante bien para mí.Una de las poderosas características de SQLite es permitirle elegir el tipo de almacenamiento. Ventajas / desventajas de cada una de las tres posibilidades diferentes:
Cadena ISO8601
Número Real
Número entero
Si necesita comparar diferentes tipos o exportar a una aplicación externa, puede usar las funciones de conversión de fecha y hora propias de SQLite según sea necesario.
fuente
localtime_r()
( sqlite.org/lang_datefunc.html#caveats_and_bugs ) en la implementación de referencia, ylocaltime()
puede ser potencialmente vulnerable a 2038 si la plataforma de host tiene un archivotime_t
. Dicho esto, dado que SQLite afirma protegerse contra esta posibilidad al mapear fechas externas en un rango seguro antes de la conversión (ver el mismo enlace), creo que es poco probable que sea un problema, excepto quizás en casos esotéricos.Para prácticamente todos los asuntos de fecha y hora prefiero simplificar las cosas, muy, muy simple ... Hasta segundos almacenados en números enteros.
Los enteros siempre se admitirán como enteros en bases de datos, archivos planos, etc. Haga un poco de matemática y la convierte en otro tipo y puede formatear la fecha de la forma que desee.
Haciéndolo de esta manera, no tiene que preocuparse cuando [inserte la base de datos favorita actual aquí] sea reemplazada por [futura base de datos favorita] que casualmente no usó el formato de fecha que eligió hoy.
Es solo una pequeña sobrecarga matemática (por ejemplo, métodos, toma dos segundos, publicaré una esencia si es necesario) y simplifica las cosas para muchas operaciones con respecto a la fecha / hora más adelante.
fuente
Guárdelo en un campo de tipo
long
. VerDate.getTime()
ynew Date(long)
fuente