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

Discussion in 'Spanish Forum' started by desof, Dec 29, 2017.

  1. desof

    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 ?

    [​IMG]
     
  2. Gabino A. de la Gala

    Gabino A. de la Gala Active Member Licensed User

  3. Bladimir Silva Toro

    Bladimir Silva Toro Member Licensed User

    desof likes this.
  4. JCO

    JCO 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
     
  5. desof

    desof Well-Known Member Licensed User

    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 ?
     
  6. JCO

    JCO 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 likes this.
  7. desof

    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

    [​IMG]

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

    Code:
    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...
    Code:
    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.
     
  8. Dadaista

    Dadaista 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
     
    JCO and desof like this.
  9. desof

    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!
     
  10. ELCHARO

    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.
     
    desof and dar2o3 like this.
  11. rscheel

    rscheel Well-Known Member Licensed User

    SQLite Studio.
     
Loading...
  1. 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.
    Dismiss Notice