PDA

Ver la Versión Completa : Consulta con Fechas


cmgenny
09-05-2003, 07:16:19
holas

Tengo Problemas con una consulta SQL. Utilizo D5 y Tablas Paradox's.

La consulta es algo similar a esta:

Select * from Facturas
Where BetWeen 'Fecha_inicial' and 'Fecha_final'
Order BY Fecha

Esta consulta intenta traer las facturas comprendidas en estas fechas por el usuario, es decir, el usuario es quien introduce ambas fechas(uso mascaras para evitar errores).

Todo parace estar bien, pero el problema llega cuando intento hacer la consulta en meses diferentes, me explico si introdusco 01/04/2003 and 30/04/2003 todo sale bien pero si es de esta manera 01/03/2003 and 08/05/2003 no trae ningun registro.

podria alguien ayudarme o explicarme por que sucede esto

Gracias por sus atenciones bey bey

José Luis Garcí
09-05-2003, 14:57:44
Si no me equivoco el problema lo tienes a la hora de la sentencia con la fecha ya que pones dd/mm/aaaa y debería ser mm/dd/aaaa, o por lo menos es la manera de la que yo lo solucione, te mando mi función y prueba


//Cambia el mes y el dia de posición para las sentencias SQL
function Cambiafecha(ffecha:tDateTime):string;
var
fec2:string;
Present: TDateTime;
Year, Month, Day, Hour, Min, Sec, MSec: Word;
begin
Present:= ffecha;
DecodeDate(Present, Year, Month, Day);
fec2:=inttostr(month)+'/'+inttostr(day)+'/'+inttostr(year);
result:=fec2;
end;

Recuerda que en tu fuente iria

Query1.sql.clear;
Query1.sql.add('Select * from Facturas');
Query1.sql.add('Where BetWeen '+chr(39)+cambiafecha(Fecha_inicial)+chr(39)+' and '+chr(39)+cambiafecha(Fecha_final)+chr(39));
Query1.sql.add('Order BY Fecha');

Un saludo desde Canarias

LBriceno
11-05-2003, 22:40:15
Hola cmgenny:

Creo que lo mejor en estos casos es utilizar una consulta con parámetros, algo asi como:

Select * from Facturas
Where BetWeen :Fecha_inicial and :Fecha_final
Order BY Fecha

Donde Fecha_INicial y Fecha_Final son parámetros de tipo TDateTime.
Con esto te ahorras el problema del cambio de formato entre Fecha y String y viceversa....

cmgenny
07-06-2003, 07:22:19
holas

gracias a todos por sus respuestas.

Aun tengo algunos problemitas. Okay la tabla en la que hago la consulta es paradox y el campo fecha no esta definido como tipo date, si no, es un Alpha de 12, un string y hago la consulta es con string, por que despues de un tiempo deja de funcionar por completo.

Yo se que el problema anda por lo de, dia mes año, mes dia años. pero aun no he podido controlarlo bien.

Seria bueno cambiar el tipo de campo de la Tabla?

Muchisimas gracias a todos por sus respuestas

andres1569
07-06-2003, 12:39:25
Hola:


Seria bueno cambiar el tipo de campo de la Tabla?

Si está en tu mano, ni te lo pienses. El tiempo que pierdas reajustando la aplicación lo ganarás a la larga.

He hecho alguna prueba con Paradox sobre un campo Fecha de tipo string y el comportamiento es totalmente errático cuando le lanzo una consulta, le da igual que haya un valor almacenado como dd/mm/aaaa que como mm/dd/aaaa, y además en el resultado de la consulta influye el formato del primer registro encontrado.

Así que no te lo pienses.

cmgenny
09-06-2003, 01:13:42
Holas

Gracias me llevare de tu consejo andres

cmgenny
18-06-2003, 18:35:35
Holas

La solucion que he estado aplicando al problema mencionado es la que me da LBriceno y me funciona bien, casi a la perfecion. El bendito casi, bueno casi por que hace las consultas bien menos la de 30 dias atras.

me explico si quiero que me traiga exactamente un mes me da error.

ejem.

si la consulta es 01/01/2003 al 18/06/2003 trae todos los registros exactamente como se los pido.

pero si es 18/05/2003 al 18/06/2003 no trae a nadie. Me di cuenta al querer hacer un estado de cuenta que cortara al mes pasado a partir de la fecha de la primera compra.

Gracias por todas sus respuestas me han ayudado mucho.

LBriceno
19-06-2003, 04:26:11
Hola nuevamente:

Te hago un par de consultas:
1. ¿Que tipo de conexión utilizas con la BD, ADO, BDE, eetc?
2. ¿De que tipo de datos son tus parámetros?
3. ¿Te arroja un error o simplemente no te denuelve ningún registro?
4. ¿Tienes registros en el periodo solicitado?

te pregunto poruqe me parece bastante raro el error, ya que los campos tipo DateTime son del tipo Float., asi que debes tener en cuenta que los parametros sean de fecha, es decir la hora en 0, es decir, si tienes unregistro el 18/05/2003 15:00:00 y pides los datos desde el 18/05/2003 18:00:00, no te lo va a pescar. Esto es bueno tenerlo en cuenta cuando utilizas el termino 'Between' en la clausula 'Where'.:cool:

cmgenny
20-06-2003, 21:48:25
Respuestas

1 - Utilizo DBE con paradox y D5

2 - En la tabla el campo que utilizo para guardar la fecha es Alpha de 12 y los parametros de la busqueda son dos maskedit del tipo, /99/99/9999 y los guardo en varibles de tipo Tdate para hacer el select en SQL.

3 - Simplemente no me devuelve ningun registro.

4 - Si existen registros en el rango solicitado, como te decia si la consulta es 01/05/2003 al 20/06/2003, la hace bien pero si es 20/05/2003 al 20/05/2003 no me devuelve ningun valor.

Gracias por tu ayuda.