Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Consulta con SQL por fecha (https://www.clubdelphi.com/foros/showthread.php?t=24189)

Sayuri 11-08-2005 12:44:01

Consulta con SQL por fecha
 
Buenas compañeros,
uso tablas paradox y deseo hacer una consulta con tquery sobre unas tablas. En la consulta quiero filtrar el resultado por una fecha que la quiero coger de un TDateTimePicker. ¿Cómo puedo hacerlo en tiempo de ejecución? puesto que no me deja coger directamente en la query el valor del DateTimePicker1.Date. yo pensaba hacerlo así

Cita:

Select *
from x, ...
where tabla.fecha=DateTimePicker1.Date;
pero claro me da error

Muchas gracias

P.D. Si alguien me puede decir que función tengo que usar en el Select para poder sacar de la fecha de nacimiento la edad, directamente, se lo agradecería :-)

epuigdef 11-08-2005 12:47:29

Buenas!


Lo que tienes que poner en la select es un parámetro:

select * from table where fecha = :param

y después en el código le pasas el parámetro antes de ejecutrar la select:

(el ejemplo está preparado para componentes ADO)

Query.parameters.paramByName('param').Value := DateTimePicker1.date;
Query.open;

Un saludo


Edu

Sayuri 11-08-2005 12:59:51

¿pero el parámetro tengo que crearlo antes, da igual el nombre que ponga?

Lepe 11-08-2005 13:02:25

Ha salido la carita esa y puede que no se entienda bien, así que lo pongo de nuevo:
Código SQL [-]
 select * from x where  campoFecha >= :laFecha

En un SQL se puede poner los dos puntos y despues cualquier nombre, esto se interpreta como un parámetro, y como bien dice epuigdef hay que pasarle el parámetro antes de abrir la consulta:

Código Delphi [-]
Query.paramByName('laFecha').AsDate := DateTimePicker1.date;
query.Open;

SALUDOS

Sayuri 11-08-2005 13:09:16

Cita:

Empezado por Lepe
Código SQL [-]
select * from x where campoFecha >= :laFecha

Al poner esto en la propiedad SQL del TQuery, me dice que el parametro "laFecha" no existe

¿tengo que añadirlo antes a algún sitio? por que esto otro:

Código Delphi [-]
Query.paramByName('laFecha').AsDate := DateTimePicker1.date;
query.Open;

lo pongo en el evento onchange del DateTimePicker1.

Muchas gracias

Caro 11-08-2005 16:43:24

Hola

Yo tambien estoy empezando con esto de los parametros, me funciono bien hasta ahora. tal vez lo que te falte es ponerle tipos a tus parametros.
Esto se lo coloca en la propiedad parameters, seleccionas el parametro que añadiste y en sus propiedades indicar lo siguiente:

Datype->ftDate
Value->Type->Date

Supongo que el primero es el tipo de dato de tu base de datos, y el segundo el tipo del parametro que le pasaras.

En resumen:
1. Colocas tu sentencia sql como te indicaron
2. Defines el tipo de tu parametro
3. llamas con parambyname como te indicaron

Lo hice funcionar con BDE, ahora con ADO, me funciono perfectamente

Que todos tengan un Buen Dia

Lepe 11-08-2005 17:07:00

Cita:

Empezado por Sayuri
Al poner esto en la propiedad SQL del TQuery, me dice que el parametro "laFecha" no existe

Tendrás la consulta abierta en modo diseño, porque se puede modificar la propiedad SQL sin tener los parámetros creados.

Se añade el Sql, y despues si accedes a la propiedad query.Params, verás que estan creados ya (delphi se encarga de analizar el SQL y crear los parámetros.

Yo en algunos casos ni siquiera le indico el Datatype ni VAlue --> Type, porque en ejecución uso:
Código Delphi [-]
Query.paramByName('laFecha').AsDate :=
Por tanto, ya sabe de que tipo son los parámetros.

Por cierto, deberás cerrar la consulta al cambiar el parámetro:
Código Delphi [-]
query.Close;
Query.paramByName('laFecha').AsDate := DateTimePicker1.date;
query.Open;

Un saludo

Sayuri 12-08-2005 11:04:38

No me da error al hacer lo que me habeis dicho, pero no me coge ningún registro de la tabla, cómo si no existieran... y en esa fecha hay datos

Lepe 12-08-2005 12:30:50

Pues parece que está intercambiando el mes por el dia en la fecha que le pasas.

La verdad, es muy raro, cuando se utiliza parámetros en SQL, delphi se encarga de resolver ese conflicto con el sistema gestor de Bases de datos, así que no deberías tener errores de ese tipo, a menos que hayas cambiado el formato de fechas en el control Datetimepicker. :confused:

En cambio, cuando se usa (en tablas paradox):
Código SQL [-]
where fecha >= '01/02/2005'
Aqui si hay problemas, ya que normalmente casará las fechas con el formato mm/dd/yyyy, y nos devuelve los registros con fecha 2 de Enero.

Código Delphi [-]
sql.Add('where fecha >= ' + formatDatetime('mm/dd/yyyy', datetimepicker1.date);

Un saludo

Sayuri 12-08-2005 12:54:07

a lo mejor el problema está en que en vez de poner
Cita:

where campofecha >=:fecha;
utilizo
Cita:

where campofecha =:fecha;
porque necesito que sea exactamente igual, quiero decir que la búsqueda sea por ese dia

Lepe 12-08-2005 14:22:43

Abre la tabla con el Database Desktop, igual está guardando la hora y por eso no te lo pilla, el operador "igual" si debe funcionar.

Una alternativa que no me gusta, sería indicar:
Código SQL [-]
  where fecha >  :FechaIni and fecha < :FechaFin
FechaIni le das la fecha que busca el usuario menos 1 dia
FechaFin le das la fecha que busca el usuario más 1 dia.

Un saludo

Caro 12-08-2005 14:38:46

Gracias amigo Lepe, por haberme hecho dar cuenta que no se necesita ponerle valores al Datype ni al Value, hoy hice la prueba en BDE y en ADO y me funciono todo correctamente.
Muchisimas Gracias

Sayuri 12-08-2005 18:11:09

lo gracioso, es que utilizo varias querys en el programa y todas ellas dependen de lo mismo de un datetimepicker, pero la única que funciona correctamente es una en la que en el SELECT pongo una serie de columnas al final pongo lo del
Código SQL [-]
 where campofecha=: Fecha
y funciona corerctamente, pero en el resto de querys no funciona. En todas ellas tengo alguna función en el select cómo avg o count y algunas las tengo con group by, en todas estas es donde me da el error.

Espero que me podais ayudar, porque no tienen sentido que por la fecha me de error y si lo hago por cualquier otra exclusión (el where) como por el nombre o cualquier otra cosa me lo hace bien.

Sayuri 12-08-2005 18:15:41

realmente no es que me de error, es que me dice que no hay ninguna... pero miro la fecha en la misma tabla en todos los casos, así que si se lee bien en una de las querys ¿por qué no en el resto? Además en una de las querys, que tengo asignadas por el DataSource a un DBGrid, al activarlas con el where maldito :-) de la fecha se me queda petado el Delphi 5.

Ala que os doy la brasa...

Muchas gracias

Lepe 12-08-2005 18:24:49

Pon el SQL completo de una consulta que te error o que no salga lo esperado.

Sayuri 16-08-2005 09:34:43

perdón por el retraso :-) ha sido el puente, pero el error sigue ahi
en este caso me da error y no me deja activarlo se peta todo y tengo que cerrar el delphi:

Código SQL [-]
SELECT count(*) Pacientes, C.DESCRIPCIÓN Compañía
FROM HISTORIA H INNER JOIN COMPANIAS C ON H.COMPANIA=C.COD_COMPAÑIA
WHERE  (H.FECHA_ADMISION=:Fecha)
GROUP BY Compañía;

En este otro caso no me coge nada pero si no pongo en el where lo de la fecha va bien:
Código SQL [-]
SELECT count(*)
FROM HISTORIA
WHERE (HISTORIA.FECHA_ADMISION =:Fecha);


y el único caso en el que funciona bien es:
Código SQL [-]
SELECT H.NHC, P.APELLIDO_1, P.APELLIDO_2, P.NOMBRE, P.FECHA_NACIMIENTO,
       H.COMPANIA, H.MEDICO1, H.MEDICO2, H.HORA_ADMISION,
       H.HORA_CONSULTA, H.HORA_ALTA
FROM PACIENTES P INNER JOIN HISTORIA H ON (P.NHC=H.NHC)
WHERE (H.FECHA_ADMISION=:Fecha);

Lepe 16-08-2005 11:07:49

En la primera, tildes y la letra Ñ no lo veo yo muy claro, tendrías que renombrar los campos.

En el segundo intenta esto
Código SQL [-]
SELECT count(*), Fecha
FROM HISTORIA
WHERE (HISTORIA.FECHA_ADMISION =:Fecha)
group by Fecha

Un saludo

Sayuri 16-08-2005 11:29:52

No me da 0 pero tampoco me da lo que es, además me coge de más.

Sayuri 16-08-2005 11:33:54

Además si pongo
Código SQL [-]
SELECT count(*), Fecha
FROM HISTORIA
WHERE (HISTORIA.FECHA_ADMISION =:Fecha)
group by Fecha

me dice que no es válido fecha, así que lo hice directamente con FECHA_ADMISION


La franja horaria es GMT +2. Ahora son las 12:11:09.

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