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 28-01-2007
Jose_Pérez Jose_Pérez is offline
Miembro
 
Registrado: may 2003
Posts: 156
Poder: 22
Jose_Pérez Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 28-01-2007
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
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.
__________________
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 29-01-2007
Jose_Pérez Jose_Pérez is offline
Miembro
 
Registrado: may 2003
Posts: 156
Poder: 22
Jose_Pérez Va por buen camino
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.
Responder Con Cita
  #4  
Antiguo 29-01-2007
Avatar de Ivanzinho
[Ivanzinho] Ivanzinho is offline
Miembro Premium
 
Registrado: ene 2005
Ubicación: Galicia
Posts: 595
Poder: 20
Ivanzinho Va por buen camino
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.
__________________
Si no lees esto no vivirás tranquilo
Non lle poñades chatas â obra namentras non se remata. O que pense que vai mal que traballe n’ela; hai sitio para todos. (Castelao)
Responder Con Cita
  #5  
Antiguo 29-01-2007
Jose_Pérez Jose_Pérez is offline
Miembro
 
Registrado: may 2003
Posts: 156
Poder: 22
Jose_Pérez Va por buen camino
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.

Última edición por Jose_Pérez fecha: 29-01-2007 a las 11:44:29.
Responder Con Cita
  #6  
Antiguo 29-01-2007
Avatar de Ivanzinho
[Ivanzinho] Ivanzinho is offline
Miembro Premium
 
Registrado: ene 2005
Ubicación: Galicia
Posts: 595
Poder: 20
Ivanzinho Va por buen camino
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
__________________
Si no lees esto no vivirás tranquilo
Non lle poñades chatas â obra namentras non se remata. O que pense que vai mal que traballe n’ela; hai sitio para todos. (Castelao)

Última edición por Ivanzinho fecha: 29-01-2007 a las 13:06:38.
Responder Con Cita
  #7  
Antiguo 29-01-2007
Jose_Pérez Jose_Pérez is offline
Miembro
 
Registrado: may 2003
Posts: 156
Poder: 22
Jose_Pérez Va por buen camino
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.
Responder Con Cita
  #8  
Antiguo 29-01-2007
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
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.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #9  
Antiguo 29-01-2007
Avatar de Ivanzinho
[Ivanzinho] Ivanzinho is offline
Miembro Premium
 
Registrado: ene 2005
Ubicación: Galicia
Posts: 595
Poder: 20
Ivanzinho Va por buen camino
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.
__________________
Si no lees esto no vivirás tranquilo
Non lle poñades chatas â obra namentras non se remata. O que pense que vai mal que traballe n’ela; hai sitio para todos. (Castelao)
Responder Con Cita
  #10  
Antiguo 30-01-2007
Jose_Pérez Jose_Pérez is offline
Miembro
 
Registrado: may 2003
Posts: 156
Poder: 22
Jose_Pérez Va por buen camino
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.
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Busqueda segun el mes de una fecha(no la fecha completa) federiconqn21 Firebird e Interbase 1 05-05-2006 15:39:53
Comparar una fecha de n campo date contra fecha actual amadis SQL 2 27-06-2005 21:37:41
Dias entre una fecha y la fecha del sistema afarenas Firebird e Interbase 1 30-09-2003 17:36:53
fecha en SQL ebeltete SQL 1 22-08-2003 04:27:52
Fecha con ADO manu Conexión con bases de datos 2 13-08-2003 21:54:48


La franja horaria es GMT +2. Ahora son las 09:02: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