Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   como hacer consulta SQL con fecha usando Between (https://www.clubdelphi.com/foros/showthread.php?t=25159)

MaSSaKKre 14-09-2005 10:08:29

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 :D

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 :cool:

marcoszorrilla 14-09-2005 10:18:45

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.

MaSSaKKre 14-09-2005 11:13:01

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

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

espero en algun momento poder devolverte el favor :cool:

Chente(rMan) 14-09-2005 16:10:30

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.

MaSSaKKre 15-09-2005 03:28:26

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 :p
Eduardo...
Saludos


La franja horaria es GMT +2. Ahora son las 19:42:13.

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