La Web del Programador: Comunidad de Programadores
 
    Pregunta:  36997 - COMO RESTAR DOS FECHAS
Autor:  Jose Vicente Petro Ortega
Bueno mi pregunta es como puedo saber cuantos meses y dias hay entre dos dos fechas claro esta siendo una anterior a la otra como por ejemplo : 12/12/01 y 30/05/02 Aqui hay 5 meses y 18 dias.
grasias por la atencion prestada espero me puedan ayudar.

  Respuesta:  areds areds
no sean brutos!!!!!

Es tan simple como:

select (fec_inicio - fec_final) /30
from tabla

  Respuesta:  XANCOPINCA CANCOPINCA
yo lo hice para oracle
/**************************años**********************/
SELECT TRUNC((FEC_FIN-FEC_INICIO)/365) AÑOS FROM M4T_PERIODOS_COTIZADOS WHERE ID_EMPLEADO='1';
/*************************MESES***********************/
SELECT TRUNC((MOD((FEC_FIN-FEC_INICIO),365)/365)*12) MESES FROM M4T_PERIODOS_COTIZADOS WHERE ID_EMPLEADO='3513';
/*************************DIAS********************************/
SELECT TRUNC(MOD(((MOD((FEC_FIN-FEC_INICIO),365)/365)*12),1)*30) DIAS FROM M4T_PERIODOS_COTIZADOS WHERE ID_EMPLEADO='1';
/************SI DIAS EJEMPLO= 12.68 PONDRIA 13 OK?********************/
SELECT ROUND((MOD(((MOD(((FEC_FIN-FEC_INICIO)/365),1))*12),1)*30)) A FROM M4T_PERIODOS_COTIZADOS WHERE ID_EMPLEADO=1;

  Respuesta:  Luis Felipe García Gutiérrez
pues bien yo me vi enfrentado al mismo problema y la solución que le hallé al problema fue esta:

procedure TFrmPpal.MENaceChange(Sender: TObject);var
a,an,ah,m,mn,mh,d,dn,dh:integer;
hoy:string;
begin
hoy:=copy((DatetoStr(Now)),1,10);
if (StrtoDate(MENace.text)<(StrtoDate(hoy))) then
begin
ah:=StrtoInt(copy(hoy,7,4));
mh:=StrtoInt(copy(hoy,4,2));
dh:=StrtoInt(copy(hoy,1,2));
an:=StrtoInt(copy(MENace.text,7,4));
mn:=StrtoInt(copy(MENace.text,4,2));
dn:=StrtoInt(copy(MENace.text,1,2));
a:=ah-an;
if mh<mn then
begin
a:=a-1;
m:=12-mn+mh;
end
else
m:=mh-mn;
if dh<dn then
begin
if m>0 then
m:=m-1
else
begin
a:=a-1;
m:=11;
end;
d:=30-dn+dh;
end
else
d:=dh-dn;
messagedlg('Edad actual: '+InttoStr(a)+' años, '+InttoStr(m)+' meses y '+InttoStr(d)+' días.',mtInformation,[mbOK],0)
end;
end;

espero sea útil...

  Respuesta:  Jose Vicente Petro Ortega

Despues de haver formulado esta pregunta trate de encontrarle una solucion al problema y creo que por medio de las siguientes funciones y el procedimiento que muestro a continuacion y que diseñe yo mismo se puede resolver el interrogante :

Function NumeroDias(ParamDia : String): String;
Var
NumDiaAux1 : String;
I : Integer;
Begin
I := 1;
NumDiaAux1 := '';
While ParamDia[I] <> '/' Do
Begin
NumDiaAux1 := NumDiaAux1 + ParamDia[I];
Inc(I)
End;
NumeroDias := NumDiaAux1
End;

Function NumeroMes(ParamMes : String): String;
Var
NumMesAux1 : String;
I : Integer;
Begin
I := 1;
While ParamMes[I] <> '/' Do
Inc(I);
Inc(I);
NumMesAux1 := '';
While ParamMes[I] <> '/' Do
Begin
NumMesAux1 := NumMesAux1 + ParamMes[I];
Inc(I)
End;
NumeroMes := NumMesAux1
End;

Procedure RestaMeses(Mes1,Mes2 : TDateTime; Var Mes : Integer);
Var
MesAux1,MesAux2,
Fecha1,Fecha2 : String;
NMes1,NMes2,
NDia1,NDia2,
Meses,Dias : Integer;
Begin
MesAux1 := DateToStr(Mes1);
MesAux2 := DateToStr(Mes2);
Fecha1 := MesAux1[Length(MesAux1)-1]+ MesAux1[Length(MesAux1)];
Fecha2 := MesAux2[Length(MesAux2)-1]+ MesAux2[Length(MesAux2)];
NMes1 := StrToInt(NumeroMes(MesAux1));
NMes2 := StrToInt(NumeroMes(MesAux2));
NDia1 := StrToInt(NumeroDias(MesAux1));
NDia2 := StrToInt(NumeroDias(MesAux2));
If Fecha1 = Fecha2 Then
Begin
Dias := NDia2 - NDia1;
Meses := NMes2 - Nmes1;
If Dias <= 0 Then
Begin
Mes := Meses
End
Else
Begin
Mes := Meses + 1
End
End
Else
Begin
Meses := (12 - Nmes1) + NMes2;
If NDia2 > NDia1 Then
Begin
Mes := Meses + 1
End
Else
Begin
Mes := Meses
End
End
End;

Si alguien tiene alguna duda o no cree que esto funcione por favor escribanme.

  Respuesta:  Armando Montoya
hola, saludos desde irapuato, gto. mexico
puedes solucionar tu problema haciendo unas cuantas operaciones de suma y resta con variables obtenidas con la función DecodeDate, que te descompone una fecha en 3 variables: Año Mes y Dia, puedes descomponer ambas fechas y restar esas variables

DecodeDate(Fecha_A_Descomponer, vAno, vMes, vDia);

ej. 1

var
Ano1,Mes1,Dia1,Ano2,Mes2,Dia2:Word;
Begin
DecodeDate(DateTimePicker1.DateTime,Ano1,Mes1,Dia1);
DecodeDate(DateTimePicker2.DateTime,Ano2,Mes2,Dia2);
....

ej. 2
var
Ano,Mes,Dia:Word;
Begin
DecodeDate(Date(),Ano,Mes,Dia);
....

Si tienes dudas comentamelo, suerte...