Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   ayuda con query para Mysql fecha. (https://www.clubdelphi.com/foros/showthread.php?t=56970)

vroa74 02-06-2008 16:43:30

ayuda con query para Mysql fecha.
 
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

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

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.


Les agrego el codigo esperando que me puedan ayudar.

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

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

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

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

Código:

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.

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

Cita:

Empezado por vroa74 (Mensaje 291287)
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 [-] 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:

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

Código Delphi [-]
            MyQuery1.SQL.Add(' Date_Format(servicios.f_ini,''%d/%m/%Y'') BETWEEN '+ QuotedStr(DateToStr(JvDateTimePicker1.Date)) + ' AND ' + QuotedStr(DateToStr(JvDateTimePicker2.Date)) +'');


La franja horaria es GMT +2. Ahora son las 08:39:06.

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