Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   resta entre fecha !! (https://www.clubdelphi.com/foros/showthread.php?t=40867)

acertij022 28-02-2007 21:08:11

resta entre fecha !!
 
Hola delphiano me surgio un problema interesante que no le ecuentro la vuelta:(
resulta que tengo que indicar si existe mas de x segundos de diferencia entre 2 fechas que se encuentra en string con el formato yyyymmddhhnnss parecia tonto lo 1º que se me ocurrio es pasarlo los 2 string a entero y hacer la resta :confused:grabe error :confused: no contemple el siguiente ejemplo:
a='20070228100003';
b='20070228095958';

esto tendria que darme 5 segundos

a alguien se le ocurre como solucionarlo

delphi.com.ar 28-02-2007 21:19:03

Yo te recomendaría pasar los strings a un TDateTime y utilizar la función SecondsBetween ;).

PD: Es importante tener la premisa que para trabajar con fechas lo mejor es que estas sean fechas y no cadenas!

acertij022 28-02-2007 22:27:14

tenes razón pero lo veo algo engorroso porque no se como estara el formato en la Pc del cliente y esta funcion se basa en el formato de Windows, igualmente gracias

luisgutierrezb 01-03-2007 01:17:08

lo mas facil convierte los valores a TDatetime
haces la resta, la parte entera es la cantidad de dias que hay de diferencia y luego la parte decimal son las horas, para eso usas el formatDateTime
algo asi como FormatDateTime('hh:nn:ss', VariableDiferenciaFecha) eso te mostrara la diferencia en horas minutos y segundos como no especificas AM/PM no tendras problemas

acertij022 02-03-2007 15:15:06

Lamentablemente no es la socucion supon que hay que calcular la diferncia entre:
20070302000001
20070301235959
Igualmente muchas gracias:o

Lepe 02-03-2007 16:44:31

El trabajo de fechas en delphi no tiene que ver con el formato usado en windows.

Bien es verdad que usando las variables ShortDateFormat de la unidad SysUtils, puedes mostrar una fecha del mismo modo que hace windows, pero también puedes usar tu método particular de mostrar una fecha como te ha dicho luisgutierrezb.

EncodeDateTime de la unidad DateUtils, te ayudará a crear las fechas y la respuesta de delphi.com.ar es la mejor.

Saludos

egostar 02-03-2007 22:15:13

Cita:

Empezado por delphi.com.ar
Yo te recomendaría pasar los strings a un TDateTime y utilizar la función SecondsBetween ;).

PD: Es importante tener la premisa que para trabajar con fechas lo mejor es que estas sean fechas y no cadenas!

Hola, yo estoy totalmente de acuerdo contigo.

Cita:

Empezado por acertij022
Lamentablemente no es la socucion supon que hay que calcular la diferncia entre:

20070302000001
20070301235959

Igualmente muchas gracias:o

Lo que yo creo es que tu problema es que no sabes como 'pasar' de un string a un DateTime, aqui te pongo un ejemplo de como hacerlo.

Código Delphi [-]
// Requieres la Unit DateUtils

var
  Inicial,Final: String;
  FInicial,FFinal: TDateTime;
  Duracion: Int64;

:::::::::

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  Inicial  := '20070301235946';
  Final    := '20070302000006';

  //Aqui se convierte tu string a TDateTime
  FInicial := StrtoDateTime(Copy(Inicial,7,2)+'/'+
                            Copy(Inicial,5,2)+'/'+
                            Copy(Inicial,1,4)+' '+
                            Copy(Inicial,9,2)+':'+
                            Copy(Inicial,11,2)+':'+
                            Copy(Inicial,13,2));
  FFinal   := StrtoDateTime(Copy(Final,7,2)+'/'+
                            Copy(Final,5,2)+'/'+
                            Copy(Final,1,4)+' '+
                            Copy(Final,9,2)+':'+
                            Copy(Final,11,2)+':'+
                            Copy(Final,13,2));

  Duracion := SecondsBetween(FFinal,FInicial);

  Label1.Caption := DateTimetoStr(FInicial);
  Label2.Caption := DateTimetoStr(FFinal);
  Label3.Caption := InttoStr(Duracion);
end;

Esto puede no ser lo mejor ni muy elegante pero funciona, estuve usando diferentes variables y en algunos casos hay una diferencia de 1 segundo, quizas por cuestiones de redondeo, no se.

Saludos y espero te ayude.

Lepe 03-03-2007 03:37:38

Cita:

Empezado por egostar
en algunos casos hay una diferencia de 1 segundo, quizas por cuestiones de redondeo, no se.

No has tenido en cuenta los milisegundos de un formato TDateTime, casi seguro que viene por ahí el fallito.

Formato de fecha y hora: 23/01/2007 23:59:59.999 (falta 1 milisegundo para que desencadene el cambio de fecha).

Saludos

richy08 14-06-2007 19:53:15

Cita:

Empezado por Lepe
El trabajo de fechas en delphi no tiene que ver con el formato usado en windows.

Bien es verdad que usando las variables ShortDateFormat de la unidad SysUtils, puedes mostrar una fecha del mismo modo que hace windows, pero también puedes usar tu método particular de mostrar una fecha como te ha dicho luisgutierrezb.

EncodeDateTime de la unidad DateUtils, te ayudará a crear las fechas y la respuesta de delphi.com.ar es la mejor.

Saludos

Hola buen dia yo tengo un problema utilizando las fechas y quiero saber si alguien me puede dar una solucion mira estoy tratando de aumentar un mes cierta fecha por ejemplo 06/20/2007 al utilizar la funcion incmonths() el resultado que me da 07/18/2007 y yo lo que quiero que haga es que me incremente el mes y vuelva a caer en el mismo dia osea que el resultado debe ser 07/20/2007 si alguien me puede decir como solucionarlo gracias.:D

jhonny 14-06-2007 20:29:41

Cita:

Empezado por richy08
Hola buen dia yo tengo un problema utilizando las fechas y quiero saber si alguien me puede dar una solucion mira estoy tratando de aumentar un mes cierta fecha por ejemplo 06/20/2007 al utilizar la funcion incmonths() el resultado que me da 07/18/2007 y yo lo que quiero que haga es que me incremente el mes y vuelva a caer en el mismo dia osea que el resultado debe ser 07/20/2007 si alguien me puede decir como solucionarlo gracias.:D

Si no te funciona IncMonth pues podemos hacerlo a mano...
Coloca la siguiente función:
Código Delphi [-]
 
function IncMes(Fecha :TDate) :TDate;
var
  mes, dia, ano :Word;
begin
  decodedate(Fecha, ano, mes, dia);
  Inc(mes);
  Result := encodedate(ano, mes, dia);
end;
Luego podras usarla asi:
Código Delphi [-]
Fecha := IncMes(Fecha);
Y Listo, espero te sirva ;).

richy08 14-06-2007 21:08:46

Cita:

Empezado por jhonny
Si no te funciona IncMonth pues podemos hacerlo a mano...
Coloca la siguiente función:

Código Delphi [-]
function IncMes(Fecha :TDate) :TDate;
var
mes, dia, ano :Word;
begin
decodedate(Fecha, ano, mes, dia);
Inc(mes);
Result := encodedate(ano, mes, dia);
end;



Luego podras usarla asi:

Código Delphi [-]Fecha := IncMes(Fecha);


Y Listo, espero te sirva ;).


muchas gracias si me sirvio pero ahora tengo otro problema como saber si un numero es multiplo de 4 :confused: y cuantos dias trae el mes en el que esta la fecha

jhonny 14-06-2007 21:33:39

La función DaysInAMonth que se encuentra en la unidad DateUtils a partir de Delphi6 y DateUtil en Delphi5 te devolvera los dias de un mes indicándole también el año.

Así:
Código Delphi [-]
DiasDelMes := DaysInAMonth(2007, 6); //Esto te devolvera 30.

Esa función sabrá de antemano cuales son los años bisiestos de manera pues que no necesitaras calcular por aparte, si el año en curso es o no es bisiesto.
Pero en caso de que obligatoriamente necesites saber si es o no Bisiesto podrás usar la función IsInLeapYear que devuelve True en caso de que si lo sea y False en caso contrario.

jhonny 14-06-2007 21:40:38

A bueno y si la cuestión no es de año bisiesto y todo el asunto, si no que solo quieres saber si un numero es multiplo de 4 o no, pues bastara con averiguar si ese numero dividido por 4 arrojara un resto de 0, un ejemplo:

Código Delphi [-]
 
if (16 mod 4 = 0) then
  ShowMessage('Es Multiplo de 4');
else
  ShowMessage('No es Multiplo de 4');

richy08 14-06-2007 21:51:19

Cita:

Empezado por jhonny
A bueno y si la cuestión no es de año bisiesto y todo el asunto, si no que solo quieres saber si un numero es multiplo de 4 o no, pues bastara con averiguar si ese numero dividido por 4 arrojara un resto de 0, un ejemplo:


Código Delphi [-]
if (16 mod 4 = 0) then
ShowMessage('Es Multiplo de 4');
else
ShowMessage('No es Multiplo de 4');




Muchas gracias jhonny me sirvio de mucha tu ayuda

JAI_ME 03-08-2007 01:47:33

Restar fechas en formato numerico 20070701
 
Perdon por la intromicion en el foro pero tengo un problema similar

expongo mi caso

tengo un archivo .bdf el cual administro desde database desktop y uso un sql del mismo para hacer consultas, puedo hacer las consultas a mi gusto... hasta aqui muy bien...

Pero el problema surge cuando tengo que restar dos fechas en esta tabla
dentro del mismo sql ( el formato de la fecha que maneja la tabla es numerico osea "20070701 - 20070805", Fecha 1 y 2 respectivamente )

Eso da como resultado numerico dentro del sql 104 muy bien es el resultado numerico, pero me intereza el resultado de la resta entre las fechas osea 35 dias, alguien sabe como hacerlo en el mismo sql.... les agradeceria mucho su ayuda....

egostar 03-08-2007 01:53:53

Yo haría una conversión de esos números a variables de tipo TDateTime y usaría la función DaysBetween();

Salud OS.

JAI_ME 03-08-2007 14:49:53

creo que esa seria una buena idea...
pero... no uso delphi, si no solamente sql y todas las operaciones las tengo que hacer con este...

muchas gracias por su ayuda


La franja horaria es GMT +2. Ahora son las 17:06:05.

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