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.
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.
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.
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 ?
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
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.
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
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.
This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
By continuing to use this site, you are consenting to our use of cookies.