Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-01-2007
ElGatitoTapatio ElGatitoTapatio is offline
Miembro
 
Registrado: nov 2006
Posts: 38
Poder: 0
ElGatitoTapatio Va por buen camino
Exclamation Como puedo obtener el numero de meses entre 2 fechas en firebird

Hola a todos, son nuevo en esto de los foros y tambien algo nuevo en firebird, necesito obtener el numero de meses que hay entre dos fecha con un Query y la verdad es que no tengo idea de como hacerlo, alguien me podria ayudar? muchas gracias...
Responder Con Cita
  #2  
Antiguo 08-01-2007
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola ElGatitoTapatio
La verdad no se con meses, pero asi se pueden calcular los dias entre dos fechas, este lo facilito Al Gonzalez:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
Var
FechHora1 :TDateTime;
FechHora2 :TDateTime;
Dias :Integer;
begin
   FechHora1:= DateTimePicker1.DateTime;
   FechHora2:= DateTimePicker2.DateTime;
   Dias := Trunc (FechHora2) - Trunc (FechHora1);
   Edit1.Text:= IntToStr(Dias);
end;
Tal vez te de una idea.
Saludos
Responder Con Cita
  #3  
Antiguo 08-01-2007
Avatar de Onti
Onti Onti is offline
Miembro
 
Registrado: jul 2003
Ubicación: La Paz - Bolivia
Posts: 500
Poder: 21
Onti Va por buen camino
Probaste la función MonthsBetween
Responder Con Cita
  #4  
Antiguo 08-01-2007
Avatar de ArdiIIa
[ArdiIIa] ArdiIIa is offline
Miembro Premium
 
Registrado: nov 2003
Ubicación: Valencia city
Posts: 1.481
Poder: 22
ArdiIIa Va por buen camino
Creo que esta función podría ayudarte

Código Delphi [-]
function Get_Meses(DataFim, DataIni: TDate):Integer;
var
  DiaF, MesF, AnoF, DiaI, MesI, AnoI: Word;
  Dias, Meses, Anos: integer;
begin
  DecodeDate( DataIni, AnoI, MesI, DiaI);
  DecodeDate( DataFim, AnoF, MesF, DiaF);
  Dias:=DiaF - DiaI;
  Meses:=MesF - MesI;
  Anos:=AnoF - AnoI;
  if Dias < 0 then
    Dec(Meses);

  Result := Meses + (Anos * 12);
end;


La podría implementar utilizando un campo autocalculado, pasándole los valores de las dos fechas.
Otra opción sería implementarla en una UDF...

NOTA: El código de la función no es mio la autoría se puede encontrar aquí;

Tú mismo.
__________________
Un poco de tu generosidad puede salvar la vida a un niño. ASÍ DE SENCILLO
Responder Con Cita
  #5  
Antiguo 08-01-2007
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
http://www.clubdelphi.com/foros/showthread.php?t=39009
__________________

Responder Con Cita
  #6  
Antiguo 09-01-2007
Avatar de rastafarey
rastafarey rastafarey is offline
Miembro
 
Registrado: nov 2003
Posts: 927
Poder: 21
rastafarey Va por buen camino
Resp

Con una sentencia sql lo puedes sacar lee la funcion extract y aplicale un poco de logica.
__________________
Todo se puede, que no exista la tecnología aun, es otra cosa.
Responder Con Cita
  #7  
Antiguo 09-01-2007
ElGatitoTapatio ElGatitoTapatio is offline
Miembro
 
Registrado: nov 2006
Posts: 38
Poder: 0
ElGatitoTapatio Va por buen camino
Gracias a todos por sus respuestas

El problema es hacerlo por medio de SQL, el error lo cometi yo ya que no me explique bien , ahi va mi bronca, tengo una tabla donde guardo informacion de muchas personas entre los datos se encuentra la fecha de ingreso. Ahora a partir de esa tabla y otras, genero una nueva donde debe de contener el numero de quincenas que han pasado desde que ingreso al sistema. Esto lo estoy haciendo por medio de un UPDATE y una subconsula a la tabla antes mencionada, pero hasta el momento solo para obtener algunos otros datos (ya que no se como sacar el no. de quincenas por medio de sql). Entoces ya que tengo los datos en la nueva tabla tengo que recorrer uno por uno hacer el calculo de las quincenas por fuera (en delphi) y hacer un update a cada uno para agregarle su no. de quincenas.
Como podran imaginarse tarda un tiempo considerable ya que estoy hablado de cerca de 2000 mil consultas, entonces la pregunta es si hay alguna manera de hacerlo a todos los datos desde un solo query. Chale escribi como cantinflas pero haber si me entienden. Agradesco mucho su ayuda.
Responder Con Cita
  #8  
Antiguo 12-01-2007
Avatar de rastafarey
rastafarey rastafarey is offline
Miembro
 
Registrado: nov 2003
Posts: 927
Poder: 21
rastafarey Va por buen camino
Veamos si esto te sirve

Tomemos estas dos fecha
1ra=01/03/2005
2da=01/01/2007
como la fechas para hacer el calculo(Si te das cuenta estan en formato europeo dia/mes/año)
interbase trata las fecha en otro formato(mes/dia/año)
lo que nos quedaria
1ra=03/01/2005
2da=01/01/2007
y como todos sabes el año tiene 365 dias o 366 si en biciesto
si dividimos 365/12 = 30,416666666666666666666666666667
Pero por precicion no se puede usar con todos esos decimales
entonces usamos 30.41666666666666667
y la instruccion sql quedaria asi

Código SQL [-]
Select cast( (cast( (cast('01/01/2007' As Date) - cast('03/01/2005' As Date)) as Double Precision) / 30.41666666666666667) As integer)
From rdb$database

cast('01/01/2007' As Date) - cast('03/01/2005' As Date))
Esto no es necesario si no usas las fechas como cadenas usalas
cast('01/01/2007' As Date) = 2dafecha
cast('03/01/2005' As Date) = 1rafecha

Por lo del formato de las fechas no debes preocurte amnos que estes pasando las fechas como cadena.
Ya que si la lees de la bse de ya esta como la quieres.

Espero te sirva de ayuda.

Nota: Y por favor si te sirvio responde diciendo que te sirvio.
__________________
Todo se puede, que no exista la tecnología aun, es otra cosa.

Última edición por rastafarey fecha: 12-01-2007 a las 08:11:01.
Responder Con Cita
  #9  
Antiguo 12-01-2007
ElGatitoTapatio ElGatitoTapatio is offline
Miembro
 
Registrado: nov 2006
Posts: 38
Poder: 0
ElGatitoTapatio Va por buen camino
muy buen metodo, pero...

gracias por la respuesta, fijate que practicamente no me sirvio el metodo ya que me acabo de dar cuenta que las fechas que esta almacenadas en la base de datos estan de tipo integer, pero con el siguiente formato yyyymmdd (ejemplo, hoy = 20,070,112), es por eso que no pude implementar tu metodo, sin embargo me dio una idea para otra funcion que necesitaba, muchas gracias.

... por cierto alguna idea para la opcion yyyymmdd?? la verdad es que ya lo deje por la paz, pero por si sale alguna otra opcion pues podria sacar una mejora del metodo....
Responder Con Cita
  #10  
Antiguo 12-01-2007
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
¿Fechas grabadas como tipo integer?

Hay muchas formas de manejar las fechas con formato 'yyyymmdd' pero como tipo cadena.... pero como enteros....
__________________

Responder Con Cita
  #11  
Antiguo 15-01-2007
ElGatitoTapatio ElGatitoTapatio is offline
Miembro
 
Registrado: nov 2006
Posts: 38
Poder: 0
ElGatitoTapatio Va por buen camino
Creo si va a estar dificil

Si lamentablemente estoy rediseñando un sistema con una base de datos ya definida y me encontre con esa bronca, pero bueno si veo que va a estar dificil solucionarlo asi que por el momento lo voy a hacer como les habia comentado anteriormente por medio de la interface de delphi y si mas delante consigo alguna forma mejor pues se los informo, muchas gracias.
Responder Con Cita
  #12  
Antiguo 19-01-2007
Avatar de rastafarey
rastafarey rastafarey is offline
Miembro
 
Registrado: nov 2003
Posts: 927
Poder: 21
rastafarey Va por buen camino
Resp

Si lo puedes implementar pero al parecer no quieren aprender a preguntar asi que limitare a responder algunas preguntas.
__________________
Todo se puede, que no exista la tecnología aun, es otra cosa.
Responder Con Cita
  #13  
Antiguo 19-01-2007
Avatar de jwmoreira
jwmoreira jwmoreira is offline
Miembro
 
Registrado: jun 2004
Posts: 83
Poder: 20
jwmoreira Va por buen camino
Thumbs up

Hola, espero te sirva esto:
Creas un procedimiento al que le envias las dos fechas numericas:
Código:
CREATE PROCEDURE SP_RESTA_FECHAS (
    AN_FECHA1 INTEGER,
    AN_FECHA2 INTEGER)
RETURNS (
    NUM_DIAS INTEGER)
AS
  declare variable vs_fecha1 varchar(10);
  declare variable vs_fecha2 varchar(10);
BEGIN
  vs_fecha1 = substring( cast(an_fecha1 as varchar(8)) from 5 for 2) || '/'||
              substring( cast(an_fecha1 as varchar(8)) from 7 for 2) || '/'||
              substring( cast(an_fecha1 as varchar(8)) from 1 for 4);
  vs_fecha2 = substring( cast(an_fecha2 as varchar(8)) from 5 for 2) || '/'||
              substring( cast(an_fecha2 as varchar(8)) from 7 for 2) || '/'||
              substring( cast(an_fecha2 as varchar(8)) from 1 for 4);
  Select cast(:vs_fecha2 As Date) - cast(:vs_fecha1 As Date) From rdb$database Into :NUM_DIAS;
  SUSPEND;
END
Luego en el select haces los siguiente:

Código SQL [-]Select (select NUM_DIAS FROM SP_RESTA_FECHAS(fechaN1,FechaN2) ) From TablaOrigen



Saludos,
Jorge.
Responder Con Cita
  #14  
Antiguo 19-01-2007
Avatar de jwmoreira
jwmoreira jwmoreira is offline
Miembro
 
Registrado: jun 2004
Posts: 83
Poder: 20
jwmoreira Va por buen camino
Agregue un argumento mas para meses y cambie el procedimiento:
Código:
CREATE PROCEDURE SP_RESTA_FECHAS (
    AN_FECHA1 INTEGER,
    AN_FECHA2 INTEGER,
    AV_TIPO CHAR (1) CHARACTER SET WIN1251)
RETURNS (
    NUM_DIAS INTEGER)
AS
  declare variable vs_fecha1 varchar(10);
  declare variable vs_fecha2 varchar(10);
BEGIN
if( av_tipo = 'M' ) then
  if (substring( cast(an_fecha1 as varchar(8)) from 1 for 4) =
      substring( cast(an_fecha2 as varchar(8)) from 1 for 4)) then
      num_dias =  cast(substring( cast(an_fecha2 as varchar(8)) from 5 for 2) as integer) -
                  cast(substring( cast(an_fecha1 as varchar(8)) from 5 for 2) as integer) + 1;
  else
      num_dias =  cast(substring( cast(an_fecha2 as varchar(8)) from 5 for 2) as integer) +
                  (( cast(substring( cast(an_fecha2 as varchar(8)) from 1 for 4) as integer) -
                     cast(substring( cast(an_fecha1 as varchar(8)) from 1 for 4) as integer) ) * 12);
else
begin
  vs_fecha1 = substring( cast(an_fecha1 as varchar(8)) from 5 for 2) || '/'||
              substring( cast(an_fecha1 as varchar(8)) from 7 for 2) || '/'||
              substring( cast(an_fecha1 as varchar(8)) from 1 for 4);
  vs_fecha2 = substring( cast(an_fecha2 as varchar(8)) from 5 for 2) || '/'||
              substring( cast(an_fecha2 as varchar(8)) from 7 for 2) || '/'||
              substring( cast(an_fecha2 as varchar(8)) from 1 for 4);
  num_dias =  cast(:vs_fecha2 As Date) - cast(:vs_fecha1 As Date);
end
SUSPEND;
END

Código SQL [-]select (select num_dias from RESTA(fecha1,fecha2,tipo) From TablaOrigen



Donde Tipo es M=Meses y por default días.

Espero en algo haberte ayudado,
Jorge.
Responder Con Cita
  #15  
Antiguo 20-01-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Para meses no he encontrado nada, para días tienes una UDF en rFunc



Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #16  
Antiguo 22-01-2007
ElGatitoTapatio ElGatitoTapatio is offline
Miembro
 
Registrado: nov 2006
Posts: 38
Poder: 0
ElGatitoTapatio Va por buen camino
Gracias jwmoreira por el procedimiento...

Lo voy a implementar y les aviso resultados
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
Calcular numero de dias entre dos fechas vero Varios 22 31-05-2011 14:37:34
Obtener tiempo entre fechas YaninaGenia Oracle 5 04-05-2006 20:46:20
función para obtener diferencias entre fechas - Firebird clanmilano SQL 1 11-11-2005 13:29:52
Numero de dias entre fechas (TDateTime) sierraja Varios 4 26-04-2005 18:29:02
numero de semanas entre 2 fechas marrullas SQL 1 10-05-2004 19:21:18


La franja horaria es GMT +2. Ahora son las 12:12:09.


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