Páginas (2):    1 2
guizans   01-05-2025, 10:30
#11
Código:
CREATE TABLE Tabla1(ID INTEGER  PRIMARY KEY AUTOINCREMENT,
dato1 INT4,
fecha DATETIME
);

Código:
Public Sub Main()
 
  Dim fecha As Date
 
 
  ConectarBasePath
 
  fecha = Date(Year(Now), Month(Now), Day(Now))
 
  'escribir(23, fecha)
 
  Print leer(fecha)
End

Código:
Private Function leer(fecha As Date) As Integer
 
  Dim r As Result
 
  r = conexion.Exec("SELECT * FROM Tabla1 WHERE fecha=&1", fecha)
  Return r["dato1"]
 
End
Código:
Private Function ConectarBasePath() As Boolean
 
  conexion = New Connection
  conexion.Name = File.Name("prueba.sqlite3")
  conexion.Type = "sqlite3"
 
  Try conexion.Open()
  conexion.Exec("PRAGMA foreign_keys=ON") 'Esta sentenza fai que se poida usar On delete restrict para non borrar datos que estan referenciados.
  If Not conexion.Opened Then Return False
  Return True
 
  Catch
    Print "Error en la creación da base de datos"
End

Private Sub CrearBaseDatos()
 
  Dim dbhost, dbName As String
  Dim n As Integer
  Dim stablas As String
  Dim f As Date
 
  dbName = "prueba.sqlite3"
  conexion = New Connection
  conexion.Type = "sqlite"
  'conexion.Host = dbhost
  conexion.Open()
  If conexion.Databases.Exist(dbName) Then
    Print "¡Atencion! La base de datos ya existe. Si continuas se borraran todos los datos que pueda contener"
    If n = 1 Then
      Kill dbhost &/ dbName
    Else
      Return
    Endif
  Endif
  conexion.Databases.Add("prueba.sqlite3")
  Wait 0.5
  conexion.Close()
  conexion.Name = dbName
  conexion.Open()
  stablas = File.Load("baseDatos")
  conexion.Exec(stablas)
  Wait 0.5

  f = Date(Year(Now), Month(Now), 1)
  conexion.Exec("INSERT INTO Prezo(fecha, prezoHoraExtra, prezoQuilometros) VALUES(&1,&2,&3)", f, 15, 0.3)
  conexion.Commit
 
 
  Catch
    Print Error.Text & " - " & Error.Where
End

Hay código copiado y pegado del programa que estoy haciendo, en este programa de prueba, pero el formato erroneo de la fecha persiste. No veo donde puede estar el error. Lo curioso es que con el componente antiguo de sqlite2, esto funciona bien, no hay problema, pero con el nuevo es donde aparece ese formato de fecha tan extraño.

Un saludo.
omoreno   01-05-2025, 22:16
#12
Hola Guizans

Como te ha comentado el colega Shordi, lo mejor es utilizar bases de datos relacionales reales, pero igualmente SQLite hace un gran esfuerzo, debe y tiene que funcionar…

Las fechas dependen de como se guarden en su respectiva base de datos...
Te he adjuntado un proyecto en consola con la forma en la que trabajo las fechas en SQLite.

Cuando lo ejecutes te debería mostrar una salida por consola como la siguiente:
[Imagen: CvHQQ6Ml.png]
Cuando veas el código del proyecto, observa:

    • Las fechas y horas las trabajo en campos separados.
    • Las fechas en SQLite las trabajo en el formato: YYYY-MM-DD (insert, update, select, ...).
    • Las fechas en Gambas las trabajo según el formato local del equipo.

Este proyecto crea la base, crea la tabla, inserta 5 registros cada vez que se ejecuta y finalmente ejecuta tres consultas.

En el Main() de las tres consultas, la primera esta basada en tu forma de armar una fecha y las otras dos según el formato que uso en SQLite:  YYYY-MM-DD.

Nota:
Este tema trata de: “Columnas calculadas o martilladas”, pero se ha mezclado con procesos relacionados a las fechas, seria bueno moverlo a un tema que se relacione con fechas.

Saludos.

.gz
Fechas_SQLite-0.0.1.tar.gz (Tamaño: 9.94 KB Descargas: 1)
Última modificación: 01-05-2025, 22:17 por omoreno.
guizans   02-05-2025, 15:20
#13
Hola omoreno.

Veo en tu código lo siguiente:
Código:
Dim f As String
  Dim h As String
  '
  conexion.Begin
  Dim i As Integer = 0
  For i = 0 To TotReg - 1
      f = Format(DateAdd(UltimaFecha, gb.Day, i), "yyyy-mm-dd")
      h = Format(Time(Now), "hh:nn:ss")
      UltimoDato1 += 1
      conexion.Exec("INSERT INTO Tabla1(dato1,fecha,hora) VALUES(&1,&2,&3)", UltimoDato1, f, h)
  Next

Estas insertando en un campo de tipo DATE un valor de tipo String. Y no protesta, es más, lo hace bien. Acabo por no entender nada de nada. Estoy mas perdido que un pulpo en un campo de fútbol. Yo hasta ahora, y nunca he tenido este problema, cuando grabo una fecha siempre lo hago como muestro en mi ejemplo, ¿está mal hecho? Pues por lo visto si. Seguiré buscando información hasta asegurarme que lo hago correctamente, o por lo menos intentar que, aunque haya una nueva versión de Gambas, la base de datos siga intacta.

Muchas gracias.

Un saludo.
Shordi   03-05-2025, 12:16
#14
A ver:
SQLite no es una base de datos con tipos definidos. Se guía por lo que ellos llaman "afinidad de datos" cuya definición exacta no recuerdo ahora mismo. Respecto a la fechas, el manual dice:

SQLite no tiene un tipo de dato dedicado a las fechas/horas. En su lugar los valores de fecha y hora se pueden almacenar como:

a) Una cadena de texto con cualquiera de los siguientes tipos comprendidos en la norma ISO-8601:
    YYYY-MM-DD
    YYYY-MM-DD HH:MM
    YYYY-MM-DD HH:MM:SS
    YYYY-MM-DD HH:MM:SS.SSS
    YYYY-MM-DDTHH:MM
    YYYY-MM-DDTHH:MM:SS
    YYYY-MM-DDTHH:MM:SS.SSS
    HH:MM
    HH:MM:SS
    HH:MM:SS.SSS

b) El número de día Juliano incluyendo fracciones de día desde -4713-11-24 12:00:00 
    Por ejemplo: 2460825.09444444

c) El formato de Unix, que el número de segundos transcurridos desde 1970-01-01 00:00:00 
    Por ejemplo 1748528160

A ésto hay que sumar que Gambas tiene sus propios formatos y maneras de manejar las fechas. No voy a explicarlo aquí porque ya está mejor explicado por Benoit aquí:
https://gambaswiki.org/wiki/doc/date
Este de abajo está traducido por google:
https://gambaswiki-org.translate.goog/wi...r_pto=wapp

Dicho ésto, Guizans, y sin haber probado tu código, básicamente creo que es correcto. Sólo quedaría tener en cuenta que la función Date( etc) hace un tipo de conversión (no recuerdo si a la fecha local o a la absoluta) que tal vez sea la fuente del problema... si es que no lo es que el servidor tenga establecido un idioma y el cliente otro o algo así.

Sea como sea con SQLite es así, puedes poner una cadena de caracteres y se lo traga, o un número y también. De hecho, en SQLite todo es texto a la hora de grabar y sólo se divide en tipos a la hora de leer... un poco caos. El eterno dilema entre libertad y seguridad.
¿Que qué te aconsejo? Según tus aspiraciones. Si aspiras a manejar base de datos, si aspiras a escalar tus programas a otros motores de BD, usa los formatos fijos, tal como lo haces. Si sólo quieres SQLite... pues lo que más cómodo te sea.

Saludos

No podemos regresar
guizans   04-05-2025, 21:02
#15
Gracias Shordi.

Pues nada, a por la cadena de caracteres, es lo más cómodo. Mi programa no va a salir de mi ordenador, así que me vale así.

Muchas gracias.
Páginas (2):    1 2
  
Usuarios navegando en este tema: 1 invitado(s)
Powered By MyBB, © 2002-2025 MyBB Group.
Made with by Curves UI.