Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   restar dos fechas (https://www.clubdelphi.com/foros/showthread.php?t=2983)

seken 15-08-2003 21:15:51

restar dos fechas
 
estimados
tengo el problema de restar dos fechas, y no encuentro una función que lo haga, hay alguna función?
hago esto:

function
var dias:Tdate;
begin
dias:=TableFecha2.asdatetime -
TableFecha1.asdatetime;
TableDias.AsInteger:=StrToInt(DatetoStr(dias));
end;

el error es: '23/10/1900 is no un valid integer value, y he restado
30/05/2004 - 07/08/2003.

Yo he restado en otras ocaciónes horas y no tuve problema, resto una con otra y funciona.
muchas gracias

:) ;) :p

__cadetill 15-08-2003 21:38:22

el error en que linea te lo da, en la resta o en la conversion de tipos?

jhonny 15-08-2003 21:41:46

trata de hacerlo asi:
Código:

    TableDias.AsFloat := TableFecha2.asdatetime -
    TableFecha1.asdatetime;

Ensayalo, dejando tu campo TableDias entero y nos cuentas.
espero te funcione.

Al González 15-08-2003 22:22:59

¡Buen día a todos!

Seken:

Las restas de fechas son algo sencillo. Recordar que el tipo de dato TDate (o TDateTime) es equivalente al tipo de dato Double, es decir un número de punto flotante.

Una fecha en formato TDate, es un número fraccionario donde la parte entera es la cantidad de días (transcurridos desde el 30 de diciembre de 1899).

Teniendo esto en cuenta, la siguiente resta nos debe dar como resultado la cantidad de días que transcurren desde Fech1, hasta Fech2:


Var
Fech1 :TDate;
Fech2 :TDate;
Dias :Integer;

Begin
Dias := Trunc (Fech2 - Fech1);


Nótese que se utiliza la función Trunc, para poder asignar el resultado a la variable Integer Dias. Debido a que Fech2 y Fech1 son valores de punto flotante, el resultado de la resta es también un valor de punto flotante (aunque sea un número entero), por lo cual, si queremos asignar el resultado a una variable Integer, tenemos que convertirlo a un valor entero (en este caso utilizando la función Trunc).

No parece haber necesidad de una función que reste fechas, ya que Trunc (Fecha1 - Fecha2) es hasta cierto punto suficiente. Sin embargo, al tratarse de valores TDateTime (donde los valores generalmente presentan una fracción que indica también la hora), la resta Trunc (Fecha1 - Fecha2) puede causar un efecto inesperado.

Considere el siguiente caso:


Var
FechHora1 :TDateTime;
FechHora2 :TDateTime;
Dias :Integer;

Begin
{ Suponiendo que FechaHora1 sea 10/ene/2003 12:00 PM y que FechHora2 sea 12/ene/2003 6:00 AM }
Dias := Trunc (FechHora2 - FechHora1);


La variable Dias quedaría con un valor de 1 en lugar de 2, ya que la resta de FechHora2 menos FechHora1 da un resultado de 1.75, que truncado (Trunc) es 1.

Teniendo esto en cuenta, la resta de las fechas contenidas en las anteriores variables TDateTime debería ser:


Dias := Trunc (FechHora2) - Trunc (FechHora1);


Para un servidor, esto justifica la creación de una función que devuelva la cantidad de días transcurridos entre dos fechas, tomando en cuenta que los parámetros dados a la función pueden ser valores TDate o TDateTime con parte fraccionaria (con hora incluída).

Probablemente dicha función será agregada en la siguiente versión de Interfaz GH.

Espero esto sea de utilidad, seguimos en contacto.

Al González.

seken 15-08-2003 23:34:56

Muc has gracias por toda la ayuda, ya lo probe y funciono correctamente de esta forma

TableDias.AsFloat := TableFecha2.asdatetime -
TableFecha1.asdatetime;

agradezco toda la explicacion teorica del proque de tipos Datatime, Tdata y otros.
Espero poder ayudar en una proxima duda

Saludos

:D ;)


La franja horaria es GMT +2. Ahora son las 14:44:52.

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