PDA

Ver la Versión Completa : no encuentra fecha igual en consulta


anubis
01-09-2012, 02:51:32
hola,

Dando vueltas arriba o abajo no entiendo por que, cuando hago una consulta que busca una fecha igual a otra no aparece o bien, cuando hago una consulta como esta:



fecha1:=zvdatetimepicker1.Date;
fecha2:=zvdatetimepicker2.date;
zquery1.close;
zquery1.sql.clear;
zquery1.sql.text:='select * from tcheques where cfecha between :fecha1 and :fecha2';
zquery1.parambyname('fecha1').asdatetime:=fecha1;
zquery1.parambyname('fecha2').asdatetime:=fecha2;
zquery1.active:=true;

En ese caso, si le pongo de primera fecha 11/11/2011, no me la saca, para eso tengo que ponerle 10/11/2011.

He probado con esto para probar el detalle de fecha igual:


fecha1:=zvdatetimepicker1.Date;
zquery1.close;
zquery1.sql.clear;
zquery1.sql.text:='select * from tcheques where cfecha = :fecha1';
zquery1.parambyname('fecha1').asdatetime:=fecha1;
zquery1.active:=true;


pero no muestra ninguna, no me funciona.

Alguien sabe porque la fecha inicial no la usa y la final si?.

Caral
01-09-2012, 03:00:01
Hola
Me imagino que between es entre en ingles, tal vez es eso lo que pasa, yo uso esto:

fecha1:=zvdatetimepicker1.Date;
fecha2:=zvdatetimepicker2.date;
zquery1.close;
zquery1.sql.clear;
zquery1.sql.text:='select * from tcheques where Cfecha >= :fechaA and Cfecha <= :fechaB';
zquery1.parambyname('fechaA').asdatetime:= fecha1;
zquery1.parambyname('fechaB').asdatetime:= fecha2;
zquery1.active:=true;
Saludos

anubis
01-09-2012, 03:10:05
Gracias, pero si también probé eso y sigue igual,

uso sqlite y lazarus.

nose donde puede estar el detalle.

Caral
01-09-2012, 03:19:23
Hola
Pues no lo se, no deberia de tener ese comportamiento, deberia de mostrar una sola fecha siempre que las dos fechas de los datetimepickers sean iguales.
no lo se.
saludos

ecfisa
01-09-2012, 05:07:38
Hola.

Tanto la consulta de tu primer mensaje como la que te sugirió Carlos son correctas.

Lo primero que se me ocurre, es pensar en los intermediarios ¿ De que tipos son las variables fecha1 y fecha2 ?
Lo segundo es atribuirlo a algún comportamiento del componente TZQuery con respecto a la conversión o los parámetros, pero aunque no lo conozco me parece poco probable...


Saludos. :)

roman
01-09-2012, 05:28:23
En ese caso, si le pongo de primera fecha 11/11/2011, no me la saca, para eso tengo que ponerle 10/11/2011.


No te saca ¿qué? ¿Cómo podemos saber qué pasa si nada más indicas lo que pones de primera fecha y no de segunda?

// Saludos

beginner01
01-09-2012, 05:34:14
Hola.

Las consultas parecen estar correctas, pero existe un inconveniente aparentemente en como sqlite maneja las fechas, pero creo que obtube una solucion que puede resolver este problema con la ayuda de la web de sqlite (http://www.sqlite.org/lang_datefunc.html) donde hay suficiente información en como usar las fechas y la forma que yo use fué.


--Ejemplo1.

select *
from testfecha
where strftime('%Y-%m-%d',fecha) <= strftime('%Y-%m-%d','2012-08-31')

--Ejemplo2.
select *
from testfecha
where strftime('%d/%m/%Y',fecha) = strftime('15/08/2012')

--Ambos ejemplos me funcionaron perfectamente usando sqlite3, zeos 6.6.6 y delphi XE.


Ya con esto puedes "jugar" con el formato para que se ajuste a lo que necesitas.

anubis
01-09-2012, 06:01:00
gracias por las respuestas amigos.

Roman, me referia a que no hace el filtrado como es debido y no me muestra los valores en esa fecha, de ahi que tenga que cambiar a otra fecha anterior.

las variables fecha1 y fecha2 son tipo tdate.

beginner01, ya intente probar ese metodo aplicandolo al ejemplo primero que puse pero a la hora de ejecutar me da error.

Vere mañana la documentacion que me dices de sqlite3.

gracias

Casimiro Notevi
01-09-2012, 09:56:40
Amigo Anubis, tal y como dice Román, nos faltan datos para poder ayudar adecuadamente.

Spynosa
01-09-2012, 11:56:38
Creo que tienes que poner
zquery1.parambyname('fechaA').asdate:= fecha1;

ya que asdatetime te guarda tambien la hora y si no coincide con la consulta pues no te sale

movorack
01-09-2012, 16:07:40
Como dice spynosa... la cuestión puede ser que en la DB solo tengas almacenado el valor de la fecha y el DateTimePicker almacena el valor de fecha + hora y si además le pasas como AsDateTime etarias tratando de comparar

01/09/2012 = 01/09/2012 08:50:00

Lo cual nunca va a funcionar.

MartinS
01-09-2012, 18:32:15
A mi tambien me pasa como expone Anubis y lo resolvi como dice Caral, es decir si indico un rango de fecha desde por ejemplo el 01/08/2012 a 31/08/2012 el 01 no me lo muestra, arranca desde el 02/08/2012 .
saludos

ecfisa
01-09-2012, 19:34:55
A mi tambien me pasa como expone Anubis y lo resolvi como dice Caral, es decir si indico un rango de fecha desde por ejemplo el 01/08/2012 a 31/08/2012 el 01 no me lo muestra, arranca desde el 02/08/2012 .
saludos
Hola MartinS.

Si es muy posible, por que el comportamiento del operador BETWEEN depende de la implementación que le dé cada RDBMS. En algunas realiza una selección inclusiva del conjunto de datos comprendidos entre el valor inicial y final y en otros lo hace de forma exclusiva. Un tercer grupo lo hace de manera inclusiva sobre el valor inicial y exclusiva sobre el final.

Es decir que la instrucción:
SELECT * FROM TABLA WHERE NOMBRE BETWEEN :DESDE AND :HASTA
En algunas bases de datos será equivalente a
SELECT * FROM TABLA WHERE NOMBRE > :DESDE AND NOMBRE < :HASTA
en otras:
SELECT * FROM TABLA WHERE NOMBRE >= :DESDE AND NOMBRE =< :HASTA
y en otras:
SELECT * FROM TABLA WHERE NOMBRE >= :DESDE AND NOMBRE < :HASTA
Por eso es importante leer en la documentación de la base de datos a utilizar sobre el tratamiento que le da a este operador, u optar por usar los operadores <,>,= que no dá lugar a equívocos.

Saludos.:)

anubis
01-09-2012, 21:15:13
Si es que soy un burro con todas las letras.
Aqui dando la lata y al final es lo que deciais, poner solo asdate en vez de asdatetime y ya funciono.

Mis disculpas a todos, y mirad que le di vueltas y al final fue tan sencillo que era para pegarme de tortas.:o

saludos