Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   no encuentra fecha igual en consulta (https://www.clubdelphi.com/foros/showthread.php?t=80064)

anubis 01-09-2012 02:51:32

no encuentra fecha igual en consulta
 
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:

Código Delphi [-]

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:

Código Delphi [-]
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:
Código Delphi [-]
   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

Cita:

Empezado por anubis (Mensaje 441439)
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 donde hay suficiente información en como usar las fechas y la forma que yo use fué.

Código SQL [-]
--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

Cita:

Empezado por MartinS (Mensaje 441462)
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:
Código SQL [-]
SELECT * FROM TABLA WHERE NOMBRE BETWEEN :DESDE AND :HASTA
En algunas bases de datos será equivalente a
Código SQL [-]
SELECT * FROM TABLA WHERE NOMBRE > :DESDE AND NOMBRE < :HASTA
en otras:
Código SQL [-]
SELECT * FROM TABLA WHERE NOMBRE >= :DESDE AND NOMBRE =< :HASTA
y en otras:
Código SQL [-]
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


La franja horaria es GMT +2. Ahora son las 08:36:53.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi