Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Desesperado al comparar dos fechas - horas (https://www.clubdelphi.com/foros/showthread.php?t=41085)

Durbed 07-03-2007 12:51:56

Desesperado al comparar dos fechas - horas
 
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.
Cita:

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

Mira!
 
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
Código Delphi [-]
   
   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

¿Son solo fechas?
 
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í:
Código Delphi [-]
   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 :
Código Delphi [-]
var
  Fecha1, Fecha2 : TDateTime;
  ...

Y la comparación estás haciéndola con Fecha1 y Fecha2 :
Código Delphi [-]
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 :
Código Delphi [-]
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

Otra alternativa
 
:) 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).
Código Delphi [-]
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

¿Hay conclusión?
 
: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

Operación con fechas
 
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

Problemas de siempre
 
Intenta hacer lo siguiente:

Código Delphi [-]
  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
 
Gracias...
Solucione el problema de la siguiente manera:
if DmSip.TblSolicituDiarios.Locate('FECHA',vararrayof ([fechaArranque]), []) then :D

juliobuitrago 15-04-2007 07:44:38

Units
 
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


La franja horaria es GMT +2. Ahora son las 19:17:49.

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