Spanish [SOLUCIONADO] Cual formato es el indicado para guardar fechas en SQLite

desof

Well-Known Member
Licensed User
Hola, estoy utilizando unas bases de datos .db de sqlite para mi proyecto y en un campo necesito hacer luego operaciones con fechas para calcular dias.
Pero me encuentro como muestra la imagen que no tiene ningun campo Date para configurar.

Cual debo utilizar ? , TEXT ?

 

JCO

Active Member
Licensed User
Hola Desoft

Yo uso SQLite Administrator lo descargas aqui: http://sqliteadmin.orbmu2k.de/

Mira puedes crear el campo fecha (DATE)
Es cierto que permite crear campos de tipo fecha, pero internamente, SQLite los trata de manera diferente:
https://www.sqlite.org/datatype3.html
SQLite does not have a storage class set aside for storing dates and/or times. Instead, the built-in Date And Time Functions of SQLite are capable of storing dates and times as TEXT, REAL, or INTEGER values:

  • TEXT as ISO8601 strings ("YYYY-MM-DD HH:MM:SS.SSS").
  • REAL as Julian day numbers, the number of days since noon in Greenwich on November 24, 4714 B.C. according to the proleptic Gregorian calendar.
  • INTEGER as Unix Time, the number of seconds since 1970-01-01 00:00:00 UTC.
Applications can chose to store dates and times in any of these formats and freely convert between formats using the built-in date and time functions.
Personalmente, utilizo siempre el formato aconsejado TEXT -ISO8601 ("YYYY-MM-DD HH:MM:SS.SSS"), porque así estoy seguro de lo que sucede. Con otros métodos, me dan un poco de miedo las conversiones que el sistema pueda llevar a cabo y que pueden traer problemas en aplicaciones instaladas en países diferentes.

Si tú vas a hacer muchos cálculos, a lo ,mejor te convenría más el tipo Integer - Unix Time.

Saludos,

Julio
 

desof

Well-Known Member
Licensed User
Es cierto que permite crear campos de tipo fecha, pero internamente, SQLite los trata de manera diferente:
https://www.sqlite.org/datatype3.html
SQLite does not have a storage class set aside for storing dates and/or times. Instead, the built-in Date And Time Functions of SQLite are capable of storing dates and times as TEXT, REAL, or INTEGER values:

  • TEXT as ISO8601 strings ("YYYY-MM-DD HH:MM:SS.SSS").
  • REAL as Julian day numbers, the number of days since noon in Greenwich on November 24, 4714 B.C. according to the proleptic Gregorian calendar.
  • INTEGER as Unix Time, the number of seconds since 1970-01-01 00:00:00 UTC.
Applications can chose to store dates and times in any of these formats and freely convert between formats using the built-in date and time functions.
Personalmente, utilizo siempre el formato aconsejado TEXT -ISO8601 ("YYYY-MM-DD HH:MM:SS.SSS"), porque así estoy seguro de lo que sucede. Con otros métodos, me dan un poco de miedo las conversiones que el sistema pueda llevar a cabo y que pueden traer problemas en aplicaciones instaladas en países diferentes.

Si tú vas a hacer muchos cálculos, a lo ,mejor te convenría más el tipo Integer - Unix Time.

Saludos,

Julio
Hola amigo, y respecto a este comentario que haces.. si utilizas el formato TEXT -ISO8601 ("YYYY-MM-DD HH:MM:SS.SSS") como haces para ordenar los registros desde la BD por ese campo por que es el gran problema que tengo es que los campos los tengo que devolver ordenados por fecha.
Ya he provado poniendo el campo como DATE y no me ordena absolutamente nada.
Como configuras el tipo ISO8601 ?
 

JCO

Active Member
Licensed User
Simplemente como texto normal. Lo bueno que tiene precisamente esta solución es que al ordenar en base de datos, las fechas siempre se ordenan bien directamente.
Lo único que hay que hacer es en B4A, transformar los ticks en formato YYYY-MM-DD y guardarlos en un campo de tipo TEXT
 

desof

Well-Known Member
Licensed User
Para no dejar este hilo sin ovillar cuento mi solución para algun otro que por ahi tenga esta historia.
Al final coloque el campo como donde almaceno la fecha como DATE



Guardo la fecha en LabelDate.Tag en el formato que se ve en el código....

B4X:
ub Date_onDateSet(year As Int, monthOfYear As Int,    dayOfMonth As Int) 
    Dim d As Long
    DateTime.DateFormat = "dd.MM.yyyy" 
    monthOfYear=monthOfYear+1
    d = DateTime.DateParse(dayOfMonth&"."&monthOfYear&"."&year)
    LabelDate.Text = dayOfMonth& " de "& DateUtils.GetMonthName(d)&" de "&year
    LabelDate.Tag = year&"/"&Left(DateTime.GetMonth(d))& "/"& Left(dayOfMonth)
    ACSpinner1.Tag =d
  
End Sub
Luego para obtener los datos asi...
B4X:
If Ordenar Then
            dbCursor = Main.SQLF.ExecQuery("SELECT * FROM productos ORDER BY expira ASC")
        Else
            dbCursor = Main.SQLF.ExecQuery("SELECT * FROM productos ORDER BY expira DESC")
        End If
IMPORTANTE:
Noté que para que ordene correctamente si o sí hay que guardar en el campo la fecha en este formato "yyyy/MM/dd"
y siempre con 2 dígitos para el Mes y para el día por que si guardamos 2018/1/12 (12 de de Enero de 2018) no será ordenado correctamente.
 

Dadaista

Active Member
Licensed User
Hola
Yo, como dice @JCO, para las fechas utilizo un campo texto con la fecha en formato americano.. o sea "yyyymmdd" y siempre saldrá ordenado. Está claro que el mes y el dia han de ir en formato de 2 dígitos porque sino, no funcionará la ordenación.

Con los campos tipo "hora" hago exactamente lo mismo. Campo texto y hora en formato 24 Horas. "hh:mm:ss"

Siempre saldrá ordenado.

Como hace @desof, si hay un label, o un campo tipo fecha, con guardar en la propiedad tag del control la conversión en formato americano es suficiente. Eso es exactamente lo que hago yo con las fechas
 

desof

Well-Known Member
Licensed User
Yo en un principio lo tenia como texto y no lograba un ordenamiento correcto. Por eso quería dejarlo como experiencia. Gracias!
 

ELCHARO

Member
Licensed User
Para mi ver guardar en ticks es otra buena opcion. El tick es uniforme, no tiene formato alguno.
Se guarda y listo, leer y escribir es sencillo, las funciones de fecha manejan bien las conversiones de ticks a strings
Como es un numero nunca ser ordena siempre. Sin importar formato.

Busquen explicacion en B4A User's Guide chapter 5.1.9 Date / Time functions.

Slds.
 
Top