Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-09-2005
MaSSaKKre MaSSaKKre is offline
Miembro
 
Registrado: sep 2005
Posts: 34
Poder: 0
MaSSaKKre Va por buen camino
Question como hacer consulta SQL con fecha usando Between

Hola, un saludo a todos los que lean este hilo.
antes que nada me presento, me llamo Eduardo, soy de México

Tengo un problema y quisiera ver si alguien ha pasado por lo mismo y si logro solucionar el problema me pueda ayudar.

Mi situación radica en que... estoy haciendo un sistema para el control de Infracciones (Multas a conductores), entre las tantas consultas que he realizado con Delphi 5 y SQL encontre un problema al momento de intentar hacer una consulta donde me muestre a las personas que han sido Infraccionadas en cierto mes.
Por ejemplo, ahora es septiembre y me gustaria saber que personas fueron infraccionadas en Marzo.

Tengo una consulta en la que puedo ver a los que fueron infraccionados en un dia específico, utilizo como parametro de búsqueda un control DateTimePicker1, mi consulta queda asi:
Código:


SELECT CONTEOINFRACCIONES.NUM_CONDUCTOR,FOLIOULTIMAINFRACCION,INFRACCION.NUMFOLIO, FECHAULTIMAINFRACCION, VECESINFRACCIONADO,NOMBRE, APE_PAT,APE_MAT,CONDUCTOR.NUM_CONDUCTOR, LICENCIA, NUMFOLIO, STATUS, FECHAINFRACCION, NUMINFRACCION

FROM CONTEOINFRACCIONES, CONDUCTOR, INFRACCION

WHERE VECESINFRACCIONADO>=1 AND CONTEOINFRACCIONES.NUM_CONDUCTOR = CONDUCTOR.NUM_CONDUCTOR AND FOLIOULTIMAINFRACCION=NUMFOLIO AND STATUS ='NO PAGADO' AND FECHAULTIMAINFRACCION =:FECHA

esta consulta funciona perfectamente.

Tengo otra que es para saber cuales fueron infraccionados en el mes actual, me quedo de la siguiente manera:

Código:
 
SELECT CONTEOINFRACCIONES.NUM_CONDUCTOR,FOLIOULTIMAINFRACCION,INFRACCION.NUMFOLIO, FECHAULTIMAINFRACCION, VECESINFRACCIONADO,NOMBRE, APE_PAT,APE_MAT,CONDUCTOR.NUM_CONDUCTOR, LICENCIA, NUMFOLIO, STATUS, FECHAINFRACCION, NUMINFRACCION

FROM CONTEOINFRACCIONES, CONDUCTOR, INFRACCION

WHERE VECESINFRACCIONADO>=1 AND CONTEOINFRACCIONES.NUM_CONDUCTOR = CONDUCTOR.NUM_CONDUCTOR AND FOLIOULTIMAINFRACCION=NUMFOLIO AND STATUS ='NO PAGADO' AND FECHAULTIMAINFRACCION BETWEEN :FECHAMENOS AND :FECHAMAS

en donde los parámetros FECHAMENOS y FECHAMAS son los siguientes:

procedure TESTADISTICAINFRACCIONES.BitBtn1Click(Sender: TObject);
VAR
MAS, MENOS,MES:tdatetime;
begin
//defino las variables
MAS:=IncMonth(DATE,1);
MENOS :=IncMonth(DATE,-1);

y ya en mi query las jalo asi

Código:
QUERY4.CLOSE;
QUERY4.Params[0].AsDate := MENOS;
QUERY4.Params[1].AsDate := MAS;
QUERY4.OPEN;
en la consulta anterior el problema radica en que si la fecha actual es 13 de Septiembre 2005, entonces me avienta de resultados los datos que esten comprendidos con las fechas desde el 13 de Agosto hasta el 13 de Octubre y se supone que solo quiero ver las que esten comprendidas en el MES ACTUAL.

Creo que si alguien me ayuda a solucionar el problema anterior, podré utilizar mas o menos el mismo tipo de consultar para solucionar mi problema principal que es el de buscar las personas infraccionadas en un mes en específico.

Creo que necesito saber de forma automatica el primer dia y el ultimo dia del mes (MES SELECCIONADO PARA LA CONSULTA) para así poder hacer un Between en SQL con la fecha proporcionada y podiendo calcular de antemano su primer dia y su ultimo dia del mes.

Ojala me haya podido explicar bien y me puedan comprender sobre la duda que tengo y vaya... mejor aun, que alguien me pueda ayudar.

Saludos
Responder Con Cita
  #2  
Antiguo 14-09-2005
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
Bienvenido Eduardo:

Para el mes actual, prueba a utilizar las funciones DecodeDate y EncodeDate.
Código Delphi [-]
 Var
 dia,mes,anno:Word;
 begin
 DecodeDate(Date,anno,mes,dia);
 EncodeDate(anno,mes,1);
 //así tienes el día uno del mes actual
 end;
Para el final de mes, incrementas el mes en 1, pones el día en 1,le restas uno y tienes el final de mes.

Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #3  
Antiguo 14-09-2005
MaSSaKKre MaSSaKKre is offline
Miembro
 
Registrado: sep 2005
Posts: 34
Poder: 0
MaSSaKKre Va por buen camino
Thumbs up

compañero marcoszorrilla, muchisimas gracias por su ayuda, me ha servido de mucho

Ya me las iré arreglando con la otra consulta, solo es cuestion de ajustes, muchas gracias.

espero en algun momento poder devolverte el favor
Responder Con Cita
  #4  
Antiguo 14-09-2005
Avatar de Chente(rMan)
Chente(rMan) Chente(rMan) is offline
Miembro
 
Registrado: ago 2005
Posts: 89
Poder: 20
Chente(rMan) Va por buen camino
que tal MaSSaKKre, una pregunta que BD utilizas, ya se que es SQL pero, ¿podrias ser un poco mas específico?.


¿tu BD no acepta la función moth ?.

porque tambien lo podrias generar así:

Código SQL [-]
where month( size="1">FECHAULTIMAINFRACCION) =: Mes

algo pasa, mejor te lo pongo tambien por fuera, ya que me pone algo de size

where month( FECHAULTIMAINFRACCION) =: Mes

Saludos.

Vicente López.
Tambien de México.
Responder Con Cita
  #5  
Antiguo 15-09-2005
MaSSaKKre MaSSaKKre is offline
Miembro
 
Registrado: sep 2005
Posts: 34
Poder: 0
MaSSaKKre Va por buen camino
hola chente,...

si, mira mi consulta quedo lista anoche gracias a la ayuda de mascorrilla y quedo asi

Código:
 
VAR
MAS,SUM,MENOS:tdatetime;
dia,mes,anno:Word;
 begin
 DecodeDate(Date,anno,mes,dia);
MAS:=EncodeDate(anno,mes,1);   //GUARDANDO MES ACTUAL CON DIA 1
SUM:=IncMonth(MAS,1);//SUMANDOLE UN MES AL MES ACTUAL
MENOS:=SUM-1;		//RESTANDOLE UN DIA AL MES ACTUAL+1 (OSEA MES SIGUIENTE AL ACTUAL)
EDIT1.TEXT:=DATETOSTR(MAS);
EDIT2.TEXT:=DATETOSTR(MENOS);
QUERY4.CLOSE;
QUERY4.Params[0].AsDate := MAS;
QUERY4.Params[1].AsDate := MENOS;
QUERY4.OPEN;

y el código en sql me quedo asi

Código:
  
SELECT CONTEOINFRACCIONES.NUM_CONDUCTOR,FOLIOULTIMAINFRACCION,INFRACCION.NUMFOLIO, FECHAULTIMAINFRACCION, VECESINFRACCIONADO,NOMBRE, APE_PAT,APE_MAT,CONDUCTOR.NUM_CONDUCTOR, LICENCIA, NUMFOLIO, STATUS, FECHAINFRACCION, NUMINFRACCION

FROM CONTEOINFRACCIONES, CONDUCTOR, INFRACCION

WHERE VECESINFRACCIONADO>=1 AND CONTEOINFRACCIONES.NUM_CONDUCTOR = CONDUCTOR.NUM_CONDUCTOR AND FOLIOULTIMAINFRACCION=NUMFOLIO AND STATUS ='NO PAGADO' AND FECHAULTIMAINFRACCION BETWEEN :FECHAMAS AND :FECHAMENOS




muchas gracias por tu interes en ayudarme amigo.
Estoy usando Delphi 5... ahi arribita lo especifiqué, solo que como la page se hace muy grande, entonces no se alcanza a ver.

por cierto ando con otro problemita en una consulta, pero aun me sigo calentando la cabeza, creo que cuando ya de plano no pueda tendre que dar un grito de ayuda jejejeje
Eduardo...
Saludos
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 02:34:39.


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
Copyright 1996-2007 Club Delphi