Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Where Fecha+Mes=Hoy (https://www.clubdelphi.com/foros/showthread.php?t=39718)

Jose_Pérez 28-01-2007 12:31:44

Where Fecha+Mes=Hoy
 
Hola a tod@s:

Estoy trabajando con tablas DBF y DELPHI 5. Tengo una tabla con un campo Fecha y un campo numérico donde se graba un plazo en meses.

¿Cómo puedo hace la consulta Where Fecha+Meses=Hoy?

Where Fecha+(30*Meses) no me sirve, ya que no es exacto al tener los meses entre 29 y 31 días.

Saludos.

marcoszorrilla 28-01-2007 12:55:11

Según tu planteamiento el plazo debe de darse en días y no en meses:
30, 60 ó 90, de esta manera al sumarle 30, 60 ó 90 días obtendrás los vencimientos exactos que pretendes.

Un Saludo.

Jose_Pérez 29-01-2007 11:04:27

Cita:

Empezado por Jose_Pérez
Where Fecha+(30*Meses) no me sirve, ya que no es exacto al tener los meses entre 29 y 31 días.
Saludos.

Hola Macoszorrilla:

El plazo me lo da en meses. Suponiendo que el plazo fuese 10 meses a partir de la fecha de hoy, 29/Ene/2007, el vencimiento debería ser el día 29/Nov/2007.

Sin embargo, si a la fecha de hoy, 29/Ene/2007, sumas 300 días (10x30), el resultado es 25/Nov/2005, es decir, 4 días antes de la fecha de vencimiento.

Por lo tanto, tal como comenté en el hilo anterior, Where Fecha+(30*Meses) no me sirve. :)

En cualquier caso gracias por tu interés.

Ivanzinho 29-01-2007 11:14:47

Pues suma los meses al mes de la fecha de inicio, luego tendras que comprobar que el dia exista en el mes final (p. ej. 31/11/****) y actuar como consideres oportuno.

Jose_Pérez 29-01-2007 11:35:32

Ivanzinho:

O no entiendo tu respuesta, o tu solución no me sirve.

Se trata de una tabla con varios registros, que obviamenten contienen fechas y plazos diferentes en los respectivos campos. Se trata de hacer una consulta de los registros vencidos, y no realizar un cálculo de una fecha determinada.

Algo así como esto...

Código SQL [-]
Select * from NombreTabla Where Fecha+PlazoEnMeses>=Hoy

Saludos y gracias.

Ivanzinho 29-01-2007 12:47:22

Pues para dbf se me ocurre algo como

Código SQL [-]
select * from NombreTabla 
where (cast(extract(month from Fecha) as integer) + PlazoMeses <= 12 and (
       cast(extract(month from Fecha) as integer) + PlazoMeses < cast(extract(month from FechaHoy) as integer or
       (cast(extract(month from Fecha) as integer) + PlazoMeses = cast(extract(month from FechaHoy) as integer) and
        cast(extract(day from Fecha) as integer) <= cast(extract(day from FechaHoy) as integer)) and
       cast(extract(year from Fecha) as integer) = cast(extract(year from FechaHoy) as integer))
   or
      (cast(extract(month from Fecha) as integer) + PlazoMeses > 12 and (
       cast(extract(month from Fecha) as integer) + PlazoMeses - 12 < cast(extract(month from FechaHoy) as integer or
       (cast(extract(month from Fecha) as integer) + PlazoMeses - 12 = cast(extract(month from FechaHoy) as integer) and
        cast(extract(day from Fecha) as integer) <= cast(extract(day from FechaHoy) as integer)) and
       cast(extract(year from Fecha) as integer) + 1 = cast(extract(year from FechaHoy) as integer))
   or (cast(extract(month from Fecha) as integer) + PlazoMeses > 12 and 
      cast(extract(year from Fecha) as integer) + 1 < cast(extract(year from FechaHoy) as integer))

Igual no es una buena opción, pero así de pronto y para dbf no se me ocurre otra cosa, todo sería mejorar esto.

El problema que te comentaba antes es para los dias que no existen, por ejemplo si tienes un registro del 31/1/**** con
un mes de vencimiento te daria fecha vencimientos el 31/2/**** la cual no existe por lo que el registro saldría como vencido
el primer día del mes siguente (no se si es como lo quieres tratar)

Lo dicho, esto es solo una idea, quiza muy mala y que puede tener muchos fallos ya que no me pare a probarla en profundidad,
que habría que ir depurando para que se adaptase a tus necesidades.

Pruebalo, depuralo, mejoralo y ya me contaras

Jose_Pérez 29-01-2007 15:17:03

Ivanzinho, no lo he probado, aunque creo que no me voy a complicar demasiado y voy a optar por utilizar TTables con índices. Probablemente vaya hasta más rápido.

Tal como tú propones, ¿serán demasiados cálculos para que la consulta SQL sea rápida? La verdad es que no lo sé, pero probablemente sea lenta.

Saludos y gracias.

marcoszorrilla 29-01-2007 15:38:51

Creo que con SQL va a ser dificil solventar la papeleta, porque por ejemplo si le sumamos 4 meses al mes 10, nos da 14, mes que no existe.

Si no tenemos en cuenta el SQL, con programación en Delphi, si que podemos sumar meses sin problemas de este tipo:

Un ejemplo.
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
f:Tdate;
begin
f:=Date - 40;
ShowMessage(FormatDatetime('dd/mm/yyyy',f));
f:=incMonth(f, 3);
ShowMessage(FormatDatetime('dd/mm/yyyy',f));
end;

Solución que propongo:
Crear una tabla temporal con un campo calculado y quedaría resuelto.

Un Saludo.

Ivanzinho 29-01-2007 16:34:47

Cita:

Empezado por Jose_Pérez
Ivanzinho, no lo he probado, aunque creo que no me voy a complicar demasiado y voy a optar por utilizar TTables con índices. Probablemente vaya hasta más rápido.

Yo probe con una tabla de 20000 registro y no iba lento, lo que si es es una consulta retorcida que todavía habría que retocar para que fuese 100% segura. Pero si va bien con TTables adelante que seguro que es mucho más fácil lo que conllevara a menos errores.

Cita:

Empezado por Marcos
Creo que con SQL va a ser dificil solventar la papeleta, porque por ejemplo si le sumamos 4 meses al mes 10, nos da 14, mes que no existe.

Eso lo contemplo en la consulta, siempre y cuando no haya plazos de mas de 12 meses, pero todo seria incluir mas condiciones.

Un saúdo.

Jose_Pérez 30-01-2007 10:23:02

Cita:

Empezado por Ivanzinho
Yo probe con una tabla de 20000 registro y no iba lento, lo que si es es una consulta retorcida que todavía habría que retocar para que fuese 100% segura. Pero si va bien con TTables adelante que seguro que es mucho más fácil lo que conllevara a menos errores.

Como bien dices, la consulta en sí es muy compleja y debería de pulirse un poco. Además surge otro problema. Suponte que la fecha fuese el 31/Ene/2007 y el plazo fuese de 1 mes. Obviamente, la consulta tal como tú la has planteado iría a comprobar el 31/Feb/2007, cuando obviamente el plazo correcto sería el 28, o 29 si el año fuese bisiesto, de febrero. Según tu consulta te avisaría el 1/Mar/2007, con un día de retraso.

Creo que SQL es una herramienta muy útil y rápida, pero a la hora de realizar algunas consultas y cálculos el uso de TTables siguen siendo la mejor opción.

Para serte sincero, yo esperaba alguna función simple, algo así como un AddMonth(Fecha,Meses).

Saludos.


La franja horaria es GMT +2. Ahora son las 22:15:58.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi