PDA

Ver la Versión Completa : ayuda con query para Mysql fecha.


vroa74
02-06-2008, 16:43:30
Estoy haciendo una busqueda atravez de fecha uso 2 campos fecha
cuando las fecha son iguales busca la fecha que coincida con esa fecha cuando no busca por rago de fecha
mas sin embargo no esta haciendo nada de lo que le pido

1er inconsistencia es: cuando marco dos fecha de difereste mes teniendo en cuenta que la primera es menor que la segunda la busqueda no me entrega registros y se que hay registros en esa fecha. vea la image Aqui (http://img179.imageshack.us/img179/6871/90341828xp3.png)

2do inconsistencia es: marco dos fecha dentro del mismo mes que se que hay datos, me muestra los datos mas sin embargo me muestra datos que no esta dentro de la busqueda. Vea la Imagen Aqui (http://img138.imageshack.us/img138/3613/21lr7.png)

3er inconsistencia es: busco una fecha determinada y ambos componentes les pogo la misma fecha que se que si existe y no me devuelve nada la busqueda. Vea la Imagen Aqui. (http://img71.imageshack.us/img71/4199/27307523fv8.png)


Les agrego el codigo esperando que me puedan ayudar.


if Form1.MyQuery1.Active then
begin
form1.MyQuery1.Close;
form1.MyQuery1.SQL.Clear;
end;

with form1 do
begin
MyQuery1.SQL.Add('SELECT');
MyQuery1.SQL.Add('servicios.`status`,');
MyQuery1.SQL.Add('servicios.id_ser,');
MyQuery1.SQL.Add('servicios.f_recep,');
MyQuery1.SQL.Add('servicios.f_ini,');
MyQuery1.SQL.Add('servicios.nombre,');
MyQuery1.SQL.Add('servicios.ofi_dir,');
MyQuery1.SQL.Add('servicios.f_ter,');
MyQuery1.SQL.Add('servicios.ob_sol,');
MyQuery1.SQL.Add('servicios.m_correc,');
MyQuery1.SQL.Add('servicios.m_prev,');
MyQuery1.SQL.Add('servicios.software,');
MyQuery1.SQL.Add('servicios.red,');
MyQuery1.SQL.Add('servicios.`diseño`,');
MyQuery1.SQL.Add('servicios.soporte,');
MyQuery1.SQL.Add('servicios.impresion,');
MyQuery1.SQL.Add('servicios.sol,');
MyQuery1.SQL.Add('servicios.sol_via_email,');
MyQuery1.SQL.Add('servicios.sol_via_ofi,');
MyQuery1.SQL.Add('servicios.sol_via_oral,');
MyQuery1.SQL.Add('servicios.sol_via_tel,');
MyQuery1.SQL.Add('servicios.sol_via_otro,');
MyQuery1.SQL.Add('servicios.sol_via_ofi_num,');
MyQuery1.SQL.Add('servicios.sol_via_memo,');
MyQuery1.SQL.Add('servicios.ac_rea,');
MyQuery1.SQL.Add('servicios.obser,');
MyQuery1.SQL.Add('servicios.respon,');
MyQuery1.SQL.Add('servicios.dir_resp,');
MyQuery1.SQL.Add('servicios.img');
MyQuery1.SQL.Add('FROM');
MyQuery1.SQL.Add('servicios');
MyQuery1.SQL.Add('WHERE');
if JvDateTimePicker1.Date = JvDateTimePicker2.Date then
MyQuery1.SQL.Add('servicios.f_ini = '+ QuotedStr(DateToStr(JvDateTimePicker1.Date)) +'')
else begin
MyQuery1.SQL.Add('(servicios.f_ini >='+ QuotedStr(DateToStr(JvDateTimePicker1.Date)) +') AND (servicios.f_ini <='+ QuotedStr(DateToStr(JvDateTimePicker2.Date)) +')');
end;

//ordenar
MyQuery1.SQL.Add('ORDER BY');
MyQuery1.SQL.Add('servicios.f_ini');

MyQuery1.Open; // abrir query

enecumene
02-06-2008, 18:15:31
Hola, ¿Por qué no utilizas mejor parámetros?, ¿los campos de fechas son campos tipo date?, porque veo que conviertes una fecha a string cosa que no le veo sentido :confused:.

Saludos.

vroa74
02-06-2008, 22:02:09
Mucha gracias,gracis por tu comentario mas embargo me gustaria que me dieras un ejemplo si pudieras.

Encontre el problema principal mas estoy buscando ayuda para solucionarlo
el servidor mysql tiene un formato de fecha YYYY/MM/DD delphi tima un valor del sistema de tipo DD/MM/YYYY ya intente cambiarle el formato al componente de esta forma

JvDateTimePicker1.Format :='yyyy/MM//dd'



cuendo ejecuto el query y lo visualizo queda de nuevo DD/MM/YYYY. :mad::mad:
Eso me da la idea que debo cambiarle el formato a la fecha en punto mas bajo cambiarle el formato de fecha al sistema, estoy buscando como.

me imagino que algo como system.date.format :='YYYY/MM/DD';
mas tambien puede ser iguarl de complicado cambarle la variable a mysql para que en lugar de ser %Y%M%D sea %D %M %Y

sigo buscando si encuantro la solucio la publicare mientras sigo buscando y les pido ayuda.

enecumene
02-06-2008, 23:46:38
Hola, el formato por default de MySQL no es YYYY/MM/DD sino yyyy-MM-dd, por lo tanto debería ser así:

JvDateTimePicker1.Format :='yyyy-MMM-dd'

Saludos.

vroa74
03-06-2008, 02:14:30
Mychas gracias por tu comentario.
ya lo he eintentado mas sin embargo despues de ejecutar query lo envio a un campo memo
y siguo observo que aunque le cambio el modo al momento de enviarlo al query sigue quedado de la forma

dd/MM/yyyy

te agradesco mucho que contestaras mas sigo en la busqueda de la solucion

enecumene
03-06-2008, 02:30:07
Hola, hay algo que no entiendo, pones lo siguiente:

if JvDateTimePicker1.Date = JvDateTimePicker2.Date then
MyQuery1.SQL.Add('servicios.f_ini = '+ QuotedStr(DateToStr(JvDateTimePicker1.Date)) +'')
else begin
MyQuery1.SQL.Add('(servicios.f_ini >='+ QuotedStr(DateToStr(JvDateTimePicker1.Date)) +') AND (servicios.f_ini <='+ QuotedStr(DateToStr(JvDateTimePicker2.Date)) +')');
end;

¿el campo servicios.f_ini es un campo Date o string?, por qué no intentas de esta manera?:

if JvDateTimePicker1.Date = JvDateTimePicker2.Date then
begin
MyQuery1.SQL.Add('servicios.f_ini = :fecha');
MyQuery1.ParamByName('fecha').AsDate := JvDateTimePicker1.Date;
end else begin
MyQuery1.SQL.Add('servicios.f_ini >= :inicio AND servicios.f_ini <= :final');
MyQuery1.ParamByName('inicio').AsDate := JvDateTimePicker1.Date;
MyQuery1.ParamByName('final').AsDate := JvDateTimePicker2.Date;
end;
end;

Saludos.

Edgtho
03-06-2008, 07:22:04
sino quieres utilizar parametros y segun que version de mysql tambien puedes usar la funcion DATEFORMAT dentro de la propia sentencia


MyQuery1.SQL.Add('Date_Format(servicios.f_ini,''%d/%m/%Y'') = '+ QuotedStr(DateToStr(JvDateTimePicker1.Date)) +'')


O usar FormatDateTime en la parte de fuera

vroa74
03-06-2008, 14:41:44
He notado que cuando el Rango de es al mismo mes no hay problema con la busqueda si se da 01/05/2008 al 31/05/2008.
Mas sin embargo cando el rango se sobrepasa al limite del mes las busqueda no da resultado alguno dega el grid vacio. ejemplo 01/05/2008 al 31/06/2008.


MyQuery1.SQL.Add('(Date_Format(servicios.f_ini,''%d/%m/%Y'') >= '+ QuotedStr(DateToStr(JvDateTimePicker1.Date)) +') AND ( Date_Format(servicios.f_ini,''%d/%m/%Y'') <='+ QuotedStr(DateToStr(JvDateTimePicker2.Date)) +')');


[enecumene] : Muchas gracias por la ayuda, Te agardesco todo tu apoyo, con respecto al ultiomo post, no esto asignandole valos al registro de la DB, estoy extrayendo el valor para una Consulta, quizas fui un poco o muy ambiguo al escribir y te pido disculpas.

Edgtho : Mucha gracias por tu ayuda, lo que escribiste fue exacto lo que necesitaba, mucha gracias

Y a todo los demas que lean este post espero que el problema que tengo les pueda ayudar en algo.

:o:o:o

enecumene
03-06-2008, 14:55:13
Pues vale, yo entendía que, cuando hacias la busqueda el valor del datetime lo tomaba como d/m/yyyy y no yyyy-m-d, pero ahora en este último post pues entendí lo querías hacer, Presentar la fecha resultante en otro formato. :eek::p.

Saludos.

vroa74
04-06-2008, 18:55:40
Hola:
sigo con el pequeño problema de no poder filtrar buen la base de datos, debe ser por algun detalle. el problema es cuando seleciono un rago de fechas es codigo que uso es:

MyQuery1.SQL.Add('(Date_Format(servicios.f_ini,''%d/%m/%Y'') >= '+ QuotedStr(DateToStr(JvDateTimePicker1.Date)) +') AND ( Date_Format(servicios.f_ini,''%d/%m/%Y'') <='+ QuotedStr(DateToStr(JvDateTimePicker2.Date)) +')');



mas sin embargo me sigue haciendo cosas que no le veop sentido.
por ejemplo

si seleciono un rango de fecha 01/02/2008 al 04/06/2008 me da solo 3 registros y en la base de datos de prueba en ese rango de fecha hay 21 registros.
los registros que me da son lso que inicia con 1 y 2 de cada mes, tego registro con dias 15 19 20 22 30 de cada mes mas eso nos lo muestra..

es teoria deberia estar mostrando todos alguien me podria ayudar para saber en que estoy fallando.

:confused::confused::confused::confused::confused:

nasedo
04-06-2008, 21:03:11
Hola:
sigo con el pequeño problema de no poder filtrar buen la base de datos, debe ser por algun detalle. el problema es cuando seleciono un rago de fechas es codigo que uso es:
Código Delphi [-] (http://www.clubdelphi.com/foros/#) MyQuery1.SQL.Add('(Date_Format(servicios.f_ini,''%d/%m/%Y'') >= '+ QuotedStr(DateToStr(JvDateTimePicker1.Date)) +') AND ( Date_Format(servicios.f_ini,''%d/%m/%Y'') <='+ QuotedStr(DateToStr(JvDateTimePicker2.Date)) +')');


mas sin embargo me sigue haciendo cosas que no le veop sentido.
por ejemplo

si seleciono un rango de fecha 01/02/2008 al 04/06/2008 me da solo 3 registros y en la base de datos de prueba en ese rango de fecha hay 21 registros.
los registros que me da son lso que inicia con 1 y 2 de cada mes, tego registro con dias 15 19 20 22 30 de cada mes mas eso nos lo muestra..

es teoria deberia estar mostrando todos alguien me podria ayudar para saber en que estoy fallando.

:confused::confused::confused::confused::confused:


mira compañero,

si quieres seleccionar en un rango de fechas utiliza en BETWEEN

algo asi:

var
FIni, FFin :String;
A,M,D : Word;

DecodeDate(JvDateTimePicker1.Date,A,M,D);
FIni := IntToStr(A) + '-' + IntToStr(M)+ '-' + IntToStr(D);
DecodeDate(JvDateTimePicker2.Date,A,M,D);
FFin := IntToStr(A) + '-' + IntToStr(M)+ '-' + IntToStr(D);

MyQuery1.SQL.Add('WHERE servicios.f_ini BETWEEN '+QuotedStr(Fini) + ' AND ' + QuotedStr(FFin));


asi de sencillo!!! :P
ahi platicas si funcionó!!

vroa74
06-06-2008, 15:56:00
Mucha gracias por la aclaración, no sabia la utilizacion del parametro.

mas sin embargo sigo teniendo problemas esta es mi sintaxis
cada ves que se le pega la gana me da el intervalo que le pido
si pido de 1/mayo/2008 5/junio/2008(01/05/2008 - 05/06/2008)
en ocasione me los hace bien y en otras me trae todo los datos del intervalo y adicionales y en otras me trae menos que las que se que hay en el intervalo

es un caso para la araña.


MyQuery1.SQL.Add(' Date_Format(servicios.f_ini,''%d/%m/%Y'') BETWEEN '+ QuotedStr(DateToStr(JvDateTimePicker1.Date)) + ' AND ' + QuotedStr(DateToStr(JvDateTimePicker2.Date)) +'');