Páginas (2): 1 2   
Desoljor   03-05-2021, 12:28
#1
Buenos dias, os cuento un poco.

Utilizo Gambas3 10.16
en una Ubunto 18.04

Este es el código de la función que me falla

Private Sub Busca_Menores_Por_Fechas(Desde As String, Hasta As String)

  AnyDesde = "01/01/" & (Year(Date) - Desde)
  AnyHasta = "31/12/" & (Year(Date) - Hasta)

  CmdSql = ("Select * From \"unidadfamiliar\" where \"nacimiento\" > " & AnyDesde)

  $Consulta = $Con.Exec(CmdSql)

End

Estructura de la Tabla

CREATE TABLE public.usuarios (
    indice integer,
    nombre character varying(150),
    nacionalidad character varying(50),
    documento character varying(11) NOT NULL,
    tipodocumento character varying(11),
    direccion character varying(150),
    sexo character varying(1),
    discapacidad character varying(1),
    nacimiento date
);

Estoy intentando comparar una fecha AnyDesde con el Campo nacimiento de la BDD para obtener los registros que hallan nacido despues de esa fecha pero gambas no me acepta el >.

Alguien de puede ayudar a solucinarlo?
Gracias de antemano.

P.D.
 He probado un gran numero de obciones que aparecen en los foros pero no me funcionan.
Shordi   03-05-2021, 17:22
#2
Básicamente no puedes comparar fechas con cadenas. Las fechas son números y necesitas utilizar las funciones de fecha para leer y comparar de la base de datos.

No podemos regresar
Desoljor   03-05-2021, 17:27
#3
Eso lo se Shordi, lo que no he encontrado es la forma de comparar la fecha de la BDD con una fecha que le proporcione el usuario.
por ejemplo, como encontrar los empleados que se han dado de alta en una empresa desde el 01/01/2000 hasta el 31/12/2020.

Gescias.
Shordi   03-05-2021, 19:53
#4
Nunca he usado portgre, por lo que la sintaxis correcta no te la puedo dar sin pasarme de listo pero estoy seguro que postgre tiene su propia batería de funciones de conversión. Algo así como el format(fecha, "dd/mm/yyyy") de gambas. Introduce esas funciones en el Select y te funcionará.

Algo así como
select función_de_conversión_de_postgre(mifecha,"yyyy/mm/dd") as "mifecha" where "mifecha" > "2021/12/27"

Debería funcionar sin problemas

Saludos
Última modificación: 03-05-2021, 19:54 por Shordi.

No podemos regresar
tincho   03-05-2021, 20:41
#5
(03-05-2021, 17:27)Desoljor escribió: no he encontrado es la forma de comparar la fecha de la BDD con una fecha que le proporcione el usuario.
por ejemplo, como encontrar los empleados que se han dado de alta en una empresa desde el 01/01/2000 hasta el 31/12/2020.

A ver si esto te ayuda.
Hice una pequeña base de datos en sqlite (ver mas abajo) y logre filtrar de la manera que planteaste. Luego para PostgeSQL adapte la consulta de un mensaje de Stack Overflow para obtener los mismos resultados, pero como no tengo una base postgresql a mano ahora mismo no lo probé.
SQLite
Código:
[b]PostgreSQL[/b]
[code]
[b]Tabla de ejemplo en sqlite[/b]
[code]BEGIN TRANSACTION;
CREATE TABLE IF NOT EXISTS "users" (
    "id"    INTEGER,
    "name"    TEXT UNIQUE,
    "born"    NUMERIC,
    PRIMARY KEY("id" AUTOINCREMENT)
);
INSERT INTO "users" VALUES (1,'Usuario1','1991-01-01');
INSERT INTO "users" VALUES (2,'usuario2','1992-02-02');
INSERT INTO "users" VALUES (3,'usuario3','1993-03-03');
INSERT INTO "users" VALUES (4,'usuario4','1994-04-04');
INSERT INTO "users" VALUES (5,'usuario5','1995-05-05');
COMMIT;
Saludos.

1 Saludo.
Desoljor   03-05-2021, 20:41
#6
Gracias Shordi.
El problema realmente no está en postgres, de todas maneras da lo mismo el motor de base de datos, Sql es Sql en Mysql o en postgresql.

Si yo cojo y ejecuto esta sentencia desde PgMyadmin (entorno grafico de postgres) directamente funciona perfetamente, pero al pasarla a Gambas es donde Falla.

"Select * From " usuarios " where nacimiento >= '01/01/1900' And nacimiento <= '31/12/1986' And sexo = 'H'"

En esta sentencia le doy una fecha establecida por mi, pero cuando el año de la fecha se obtiene por formulario ya no funciona

Ok tincho lo pruebo y respondo
Gracias

(03-05-2021, 20:41)tincho escribió: Saludos

Ok tincho lo pruebo y respondo
Gracias
Última modificación: 03-05-2021, 20:44 por Desoljor.
Shordi   03-05-2021, 21:24
#7
(03-05-2021, 20:41)Desoljor escribió: El problema realmente no está en postgres, de todas maneras da lo mismo el motor de base de datos, Sql es Sql en Mysql o en postgresql.
No digo que el problema esté en postgres, digo que tienes que conocer cómo maneja postres las fechas. Sql no es Sql en cualquier base de datos. Todas tienen su peculiaridades y sus dialectos. Por ejemplo, Sqlite no funciona con tipos de datos, sino con afinidad de conversión de los tipos de datos... y todo lo almacena en el disco como texto.

Si yo cojo y ejecuto esta sentencia desde PgMyadmin (entorno grafico de postgres) directamente funciona perfetamente, pero al pasarla a Gambas es donde Falla.
La clave de esto es "entorno gráfico" es decir PgMyadmin hace conversiones de los datos de la BD a tu pantalla, localización geográfica, etc. etc. según qué y cómo se lo plantees. Gambas hace sus propias conversiones según sus propios tipos de datos y tus consultas deben adecuarse a eso.

"Select * From " usuarios " where nacimiento >= '01/01/1900' And nacimiento <= '31/12/1986' And sexo = 'H'"

En esta sentencia le doy una fecha establecida por mi, pero cuando el año de la fecha se obtiene por formulario ya no funciona
No, en esta sentencia le das una cadena de texto y pgMyadmin hace las reconversiones pertinentes. Gambas hace las suyas propias. No te puedo precisar más porque, insisto, no conozco postgre, pero a poco que busques tienes páginas que te pueden orientar, como ésta: https://code.i-harness.com/es/docs/postg...s-datetime

Saludos

No podemos regresar
calcena   09-05-2021, 15:03
#8
Buenas, para la comparación de fechas, que siempre son el problema de los SGBD y creo que del 100% de ellos, lo más efectivo que yo he hecho siempre son dos reglas:
- standarizar que el formato sea el que coincida con el SGBD es decir si la instalación tiene English pues yyyy/mm/dd....o lo correspondiente
- utilizar Between {ini} and {fin} para la comparación en un rango de fechas, porque siempre querrás que sea superior a algo, pero siempre tendrás un límite superior, por ejemplo fecha actual ....fecha actual + 1 year ....etc

Saludos
ariscolombia   24-05-2021, 03:13
#9
Te cuento como lo Hago :  Los Campos para el manejo de Fecha Fecha-Hora siempre los defino de este tipo.
Código:
fecha timestamp without time zone

Al momento nutrir el campo que hace parte de un Registro, ya sea por INSERT o UPDATE

Mi función  que me trae el dato en el formato String  Requerido por Postgresql.
Código:
Parte del SQL  Funciones es un Archivo de Modulo, tú puede crearlo  donde quieras y llamarlo como quieras.....& Funciones.FechaHora(Now()) & ","....
 
Código:
PUBLIC FUNCTION FechaHora(Fecha AS Date) AS String
    
  RETURN "('" & Format$(Fecha, "yyyy-mm-dd hh:nn:ss") & "')"
 
END
 
Código:
Parte del SQL ....& Funciones.FechaHora(TextBoxFecha.Text) & ","....

Ahora, al Momento de Realizar un SELECT
Código:
Date(tu_campo_fecha) >= ('" & Format$(lafecha, "yyyy-mm-dd") & "')

Igual Puedes crear una Función para  hacer fácil .
Código:
Date(tu_campo_fecha) >= " & Fecha(lafecha) &
Archivos adjuntos
Última modificación: 24-05-2021, 16:56 por ariscolombia.
tincho   24-05-2021, 10:28
#10
Hola ariscolombia, la imagen adjunta que pusiste no se ve.
Saludos.

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