PDA

Ver la Versión Completa : Desesperado al comparar dos fechas - horas


Durbed
07-03-2007, 12:51:56
Tengo que comparar dos TDateTime, y no me funciona de ninguna manera, he probado a comprar directamente los dos TDateTime, tambien he probado la funcion CompareDateTime y por ultimo los he pasado a una cadena mediante DateTimeToStr y he comparado las cadenas y sigue sin funcionar. Decir que las fechas son iguales.

Un saludo y gracias.

gluglu
07-03-2007, 13:04:31
A mi siempre me ha funcionado sin problema comparar dos fechas con =, o <>.

A ver si lo que pasa es que tienes dos TDateTime cuya Fecha sea la misma (o distinta) pero la parte horaria te está influyendo en la comparación !

Al indicar TDateTime no sé si has tenido esto en cuenta.

JF Sebastian
07-03-2007, 13:07:11
El formato de un TDateTime creo que es del tipo double; de hecho si asignas a un double la funcion now() te la convierte en fracciones de segundos desde una determinada fecha origen. Como son fracciones de segundos puedes extraer de ella informacion sobre las horas multiplicando y tomando la parte entera. No se si te sirve de ayuda...

kuan-yiu
07-03-2007, 13:50:06
Los TDateTime son valores reales que en la parte entera guardan la fecha y en la decimal la hora. Se opera con ellos como con cualquier otro número, aunque también hay funciones específicas.
Unit
System

Delphi syntax:
type TDateTime = type Double;

Description
[...]
The integral part of a Delphi TDateTime value is the number of days that have passed since 12/30/1899. The fractional part of the TDateTime value is fraction of a 24 hour day that has elapsed.

Following are some examples of TDateTime values and their corresponding dates and times:

0..........12/30/1899 12:00 am
2.75......1/1/1900 6:00 pm
-1.25.....12/29/1899 6:00 am
35065....1/1/1996 12:00 am

Gabar'el Arley
07-03-2007, 15:26:07
No se muy bien lo que quieres mas tengo un codigo que verifica una data o horario dependiando de como lo haces!


procedure TForm1.Button1Click(Sender: TObject);
var
DT:TStringList;
begin
DT:=TStringList.Create;
DT.LoadFromFile('C:\root.txt');

if
Date >=StrToDate(Copy(DT.Text,1,10))

then
Application.Terminate;


el archivo de texto que contiene la data 'root.txt'
exemplo:

12/02/2007


espero que ayude en algo es una buena forma de comparar!

Monchi
07-03-2007, 20:09:55
Podes usar esto, asignas hora 0:00 a las fechas que tienen los TDateTimePicker antes de comparar

tfecha:tdatetime;

tfecha:=dtpdesde.date;
replacetime(tfecha,encodetime(0,0,0,0));
dtpdesde.date:=tfecha;

Espero te sirva
Saludos

PabloTech
07-03-2007, 22:36:21
La pregunta del millón es: ¿Son solo fechas?; ó es que, hay algo mas que evita que las fechas sean comparables. Pues sí, algunos componentes que editan la fecha devuelven la hora también; o puede ser que, lo estes comparando con un campo de tipo TDateTime y tenga la hora incluida. A mi me pasaron las dos cosas.
Para salir de la duda, trunca ambas fechas y luego compáralas. Así:

if Trunc(Fecha.DateTime) < Trunc(Tabla.FieldByName('Partida').AsDateTime) then
ShowMessage('Ingresaste una fecha menor a la de la tabla');


Espero te sirva. Chau..!

Durbed
08-03-2007, 11:49:19
Lo que tengo que comparar son dos TDateTime con fecha y hora, y como he dicho he probado a compararlo tal cual, compararlas con la funcion "CompareDateTime" y por ultimo he probado a pasarlo a una cadena y comparar las cadenas, que incomprensiblemente y siendo iguales no se comparan bien.

If TDateTime1 = TDateTime2 Then //No funciona

If CompareDateTime(TDateTime1, TDateTime2) = 0 Then //No funciona

c1 := DateTimeToStr(TDateTime1);
c2 := DateTimeToStr(TDateTime2);
If c1 = c2 Then //Tampoco funciona :eek:

A ver si alguien tiene idea de porque me pasa esto.

gluglu
08-03-2007, 12:23:50
Me acabo de dar cuenta de un detalle :

Espero que estés comparando los variables correctas de TDateTime de tu aplicación.

Estás mostrando comparaciones entre TDateTime1 y TDateTime2. Supongo que deberías tener declarado en tu programa dos varibales del tipo TDateTime. Algo así como :
var
Fecha1, Fecha2 : TDateTime;
...

Y la comparación estás haciéndola con Fecha1 y Fecha2 :
if Fecha1 = Fecha2 then ...

Me desconcierta un poco tu código donde haces la comparación entre TDateTime1 y TDateTime2. Si es una simple cuestión de nomenclatura de tus variables, bien. Pero si no es así, revísalo.

Por otro lado, deberías de asignar los valores de tus variables de fecha y hora a comporar a unos strings de esta manera :
var
Aux_String1, Aux_String2 : String
...

// en algún procedimiento de tu programa
Aux_String1 := FormatDateTime('dd/mm/yyyy hh:nn:ss', Fecha1);
Aux_String2 := FormatDateTime('dd/mm/yyyy hh:nn:ss', Fecha2);

y que expongas aquí los valores que te devuelven Aux_String1 y Aux_String2 para ver tus valores concretos.

PabloTech
08-03-2007, 13:55:50
:) Utilizando las herramientas provistas por gluglu podemos comparar las fechas y horas como si fueran cadenas. De esta forma yo propongo lo siguiente (que a mi parecer es infalible).

var Fecha1, Fecha2: TDateTime;
Tiempo1, Tiempo2: String;
begin
// Si en Fecha1 guardo la fecha 23/08/1974 y la hora 15:15:00 y
// en Fecha2 guardo la misma fecha pero con un minuto antes.
Fecha1 := StrToDateTime('23/08/1974 15:15:00');
Fecha2 := StrToDateTime('23/08/1974 15:14:00');
// ...

// en algún procedimiento de tu programa
Tiempo1 := FormatDateTime('yyyy/mm/dd hh:nn:ss', Fecha1);
Tiempo2 := FormatDateTime('yyyy/mm/dd hh:nn:ss', Fecha2);
// Entonces obtendría lo siguiente:
// Tiempo1 sería igual a: '1974/08/23 15:15:00' y
// Tiempo2 sería igual a: '1974/08/23 15:14:00' entonces
// ambas cadenas son perfectamente comparables
ShowMessage('Tiempo1 = ' + Tiempo1 + ' y Tiempo2 = ' + Tiempo2);
if Tiempo1 = Tiempo2 then
ShowMessage('Son los mismos tiempos.')
else
if Tiempo1 > Tiempo2 then
ShowMessage('El primer tiempo es mayor.')
else
ShowMessage('El segundo tiempo es mayor.');
// Lo correcto es que observes dos ventanas.
// La primera con los datos almacenados en Tiempo1 y Tiempo2; y
// la segunda, con el mensaje 'El primer tiempo es mayor'.

Suerte y espero que te sirva.

fidel
08-03-2007, 19:02:16
Deberías poner tu código completo.

¿Qué significa "No funciona" para tí?

Porque si no funciona te debe dar algún error, o si no te da error es que si que funciona.

Por lo tanto la conclusión que yo saco, es que sí que funciona pero que no te da el resultado que tu crees que debe dar.

Si es esto así, creo que el error sería que tu piensas que las variables son iguales y en realidad no lo son, o que piensas que son distintas y en realidad son iguales.

Recuerdo vagamente que algún problema de este tipo tuve restando dos fechas y no salía lo que yo pensaba que tenia que salir debido a las diferencias entre Now y Date.

Un saludo.

PabloTech
12-03-2007, 22:34:38
:confused: Bueno..! ¿Qué pasó? ¿Me perdí de algo? ¿A qué conclusión llegamos? ¿Al final, la comparación entre fechas funciona?

....???

Alejandrina
09-04-2007, 19:18:54
Hola, tengo el siguiente problema :confused: :
Requiero comparar la fecha de una tabla con la fecha tomada por el sistema.
El campo en la tabla es tipo Date.
La variable que toma la fecha del sistema es tipo String.
Es algo como esto:
fechaArranque:string;
.
.
fechaArranque:=datetostr(date);
Es así como tomo la fecha pero cuando hago esta pregunta:
if (Dmsip.TblSolicituDiarios['FECHA']=fechaArranque then

me presenta el siguiente error:
[Error] UFrmSolicitudPendiente.pas(201): Incompatible types: 'String' and 'Boolean'

Agradezco si alguien me puede guiar.;)

PabloTech
10-04-2007, 00:12:00
Intenta hacer lo siguiente:


var fechaArranque: TDate;
...
fechaArranque := Date;
...
if Trunc(Dmsip.TblSolicituDiarios.FieldByName('FECHA').AsDateTime)=fechaArranque then


:) Suerte y después cuenta cómo te fué...

Alejandrina
10-04-2007, 22:46:38
Gracias...
Solucione el problema de la siguiente manera:
if DmSip.TblSolicituDiarios.Locate('FECHA',vararrayof ([fechaArranque]), []) then :D

juliobuitrago
15-04-2007, 07:44:38
Tengo una serie de Units.....creo que las de sourceforge, que te hacen todo eso, me dices si las quieres, tira por fernandobuitrago@gmail.com....creo que las puedo distribuir gratis...creo, pues ellas están gratis.

DarkBlue
19-07-2012, 17:34:19
muchas gracias amigo pablotech me ha resultado tu metodo infalible al principio no funcionaba por que mi constante de fecha era tdatetime y mis otras fechas eran date! gracias