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.
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.
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.
(Última modificación: 03-05-2021, 19:54 por Shordi.)
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"
(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
SQL
SELECT*FROM users WHERE born >'1991-01-01'AND born <'1995-05-05';
PostgreSQL
SQL
SELECT*FROM users WHERE born >'1991-01-01'::DATEAND born <'1995-05-05'::DATE;
(Última modificación: 03-05-2021, 20:44 por Desoljor.)
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)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
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