Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-04-2007
eldiegofg eldiegofg is offline
Miembro
 
Registrado: mar 2007
Ubicación: Colón - Entre Ríos
Posts: 54
Poder: 18
eldiegofg Va por buen camino
Error al trabajar con fechas

Hola gente del foro, ante todo muchas gracias por su atencion ya que mi primer y unica pregunta hasta ahora se han molestado en contestarmela en forma rapida, clara y precisa, cosa que para usuarios nuevos como yo, son de gran valor y utilidad.

El motivo de esta nueva consulta es que al trabajar con tipos de datos de fecha (TDateTime) siempre me aparece el mismo resultado: "30/12/1899"
Estoy intentando hacer diferencias entre una fecha final y una fecha inicial para obtener el numero de dias transcurridos y probe dandole valores constantes a dos variables tipo TDateTime y como resultado obtengo la fecha antes mencionada. Alguna sugerencia?
Muchas gracias por su tiempo. Saludos
Responder Con Cita
  #2  
Antiguo 08-04-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Primero es necesaria una explicación acerca de ese gran desconocido TDatetime.

Una fecha en delphi es un valor double, donde la parte entera, son los días transcurridos desde el calendario base (31/12/1899), y la parte fraccionaria las horas minutos, segundos y milisegundos.

por ejemplo, sumar 1 día a una fecha, es tan simple como esto:
Código Delphi [-]
var c :Tdatetime;
begin
  c:= now; // fecha y hora actual del sistema.
  c:= c+1; // incrementamos la fecha en 1 día

Para tratar con horas, debemos hacer cálculos, por ejemplo, sumar una hora a la fecha y hora actual:
Código Delphi [-]
var c :Tdatetime;
begin
  c:= now; // fecha y hora actual del sistema.
  c:= c+(1/24); // incrementamos la fecha en 1 hora
como un día tiene 24 horas,

1/24 corresponde a 1 hora.
1/(24*60) corresponde a un minuto.
1/(24*60*60) corresponde a 1 segundo

De esta forma se pueden hacer todo tipo de cálculos correctamente y sin error.

Delphi, en la unidad DateUtils tiene toda una batería de funciones para tratar con fechas y horas sin tener que hacer cálculos, por ejemplo:
- IncDay
- IncMonth
- IncYear
- IncHour

y otras para calcular diferencias:
- DaysBetween (diferencia en días)
- DaySpan (diferencias en días y fracciones de días)
- MinutesBetween
- HoursBetween

Te recomiendo que le eches una visual, por ejemplo en la ayuda de Delphi.

De todo lo anterior, podrías hacer el cálculo de dos formas:
Código Delphi [-]
var Dias:integer;
begin
  dias := fecha1 - fecha2;
 
// o bien:
  dias := DaysBetween(fecha1, fecha2);

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #3  
Antiguo 10-04-2007
eldiegofg eldiegofg is offline
Miembro
 
Registrado: mar 2007
Ubicación: Colón - Entre Ríos
Posts: 54
Poder: 18
eldiegofg Va por buen camino
No encuentro la unit DateUtils, ni tampoco las funciones
- DaysBetween (diferencia en días)
- DaySpan (diferencias en días y fracciones de días)
- MinutesBetween
- HoursBetween
- Etc...

Tengo Delphi 5, perdon por mi ignorancia pero puede ser por eso, que sea la version de mi Delphi sea demasiado antigua?? Muchas gracias
Responder Con Cita
  #4  
Antiguo 10-04-2007
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.556
Poder: 25
egostar Va camino a la fama
Primero que nada, lo que yo creo es que estas trabajando con TDateTimePicker o con MonthCalendar y borraste la propiedad Date. Por eso te la deja como 31/12/1899.

En tiempo de ejecución pon lo siguiente:

Código Delphi [-]
//si estas usando un DateTimePicker
procedure TForm1.FormShow(Sender: TObject);
begin
   DateTimePicker1.Date := Now;
end;

//si estas usando un MonthCalendar
procedure TForm1.FormShow(Sender: TObject);
begin 
   MonthCalendar1.Date := Now;
end;

Salud OS.
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney
Responder Con Cita
  #5  
Antiguo 10-04-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Cita:
Empezado por eldiegofg
Tengo Delphi 5 puede ser por eso, que sea la version de mi Delphi sea demasiado antigua?? Muchas gracias
Muy Posiblemente sea eso, no puedo asegurarlo ya que de delphi 3 salté a delphi 6 y allí ya estaban esas funciones.

Tendrías que crear algunas rutinas que lo hagan, teniendo en cuenta mi mensaje anterior, podrías codificarlas... o eso espero.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #6  
Antiguo 11-04-2007
eldiegofg eldiegofg is offline
Miembro
 
Registrado: mar 2007
Ubicación: Colón - Entre Ríos
Posts: 54
Poder: 18
eldiegofg Va por buen camino
Hola gente, les cuento que me pase a la version 7 de Delphi y si bien encontre las funciones y la unit mencionadas sigo teniendo el mismo problema: casi todas las operaciones que hago dan como resultado 30/12/1899. Es raro porque no es 31/12/1899 como la base del calendario sino 30/12/1899. Les dejo por las dudas el fuente por si lo quieren ver, capaz estoy haciendo algo mal... espero no me reten, jaja. Muchas gracias
Archivos Adjuntos
Tipo de Archivo: zip fecha.zip (1,6 KB, 26 visitas)
Responder Con Cita
  #7  
Antiguo 11-04-2007
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.556
Poder: 25
egostar Va camino a la fama
Bueno tienes varios detalles en tu código.

1. Usas variables de tipo Double, mejor usa tipo TDateTime.
2. Estas buscando dias transcurridos entre las fechas.
3. Muestras los dias como si fuera fecha y no es así, es un valor entero.

Aqui te pongo la modificación a tu código.

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  fecha: Real;
  fecha1,fecha2:TDateTime;
begin
  fecha1:=StrtoDate('11/11/06');
  fecha2:=StrtoDate('10/10/06');
  fecha:=daysbetween(fecha1,fecha2);
  edit1.Text:=floattostr(fecha);
end;

Salud OS.
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney
Responder Con Cita
  #8  
Antiguo 13-04-2007
alixp23 alixp23 is offline
Miembro
 
Registrado: mar 2007
Posts: 10
Poder: 0
alixp23 Va por buen camino
Ayuda con tdate time

Como puedo hacer esto mismo que ustedes explican pero en c++????
Responder Con Cita
  #9  
Antiguo 14-04-2007
eldiegofg eldiegofg is offline
Miembro
 
Registrado: mar 2007
Ubicación: Colón - Entre Ríos
Posts: 54
Poder: 18
eldiegofg Va por buen camino
Ahora si anduvo bien, muchas gracias. En realidad habia probado todo lo que decis menos pasar la fecha como una cadena. Yo la fecha la asignaba directamente a la variable TdateTime y en el resultado de cualquier operacion me daba cero. Por que se hace eso de asignar como cadena y despues convertirla a date en vez de ingresarla como TdateTime directamente??
Responder Con Cita
  #10  
Antiguo 14-04-2007
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.556
Poder: 25
egostar Va camino a la fama
Cita:
Empezado por eldiegofg
Ahora si anduvo bien, muchas gracias. En realidad habia probado todo lo que decis menos pasar la fecha como una cadena. Yo la fecha la asignaba directamente a la variable TdateTime y en el resultado de cualquier operacion me daba cero. Por que se hace eso de asignar como cadena y despues convertirla a date en vez de ingresarla como TdateTime directamente??
No se exactamente porque al pasarlo como tu lo hacías el resultado da cero, pero así sucede, pienso que tal ves esta agregando también la parte Time y eso le provoque alguna inconsistencia a la función DaysBetween.

Pero, si lo que quieres es pasar directamente una variable TDateTime puedes hacer esto y funciona bien.

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  fecha: Integer;
  fecha1,fecha2:TDateTime;
begin
  fecha1:= DateTimePicker1.Date;
  fecha2:= DateTimePicker2.Date;
  fecha:=daysbetween(fecha1,fecha2);
  edit1.Text:=floattostr(fecha);
end;
Aqui estoy usando dos componentes adicionales que son los TDateTimePicker con la propiedad Date. Aunque se puede simplificar de otra manera. pero la idea es que observes la diferencia, con el StrtoDate.

Aquí la simplificación del código.

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  Dias: Integer;
begin
  Dias := daysbetween(DateTimePicker1.Date,DateTimePicker2.Date);
  edit1.Text:=floattostr(Dias);
end;
Salud OS.
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney
Responder Con Cita
  #11  
Antiguo 14-04-2007
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
Hace ya algun tiempo el Maestro Al Gonzalez hizo el codigo para restar fechas:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
Var
FechHora1 :TDateTime;
FechHora2 :TDateTime;
Dias :Integer;
begin
   FechHora1:= DateTimePicker1.DateTime;
   FechHora2:= DateTimePicker2.DateTime;
   Dias := Trunc (FechHora2) - Trunc (FechHora1);
   Edit1.Text:= IntToStr(Dias);
end;
Saludos
Responder Con Cita
  #12  
Antiguo 16-04-2007
Avatar de Maury Manosalva
Maury Manosalva Maury Manosalva is offline
Miembro
 
Registrado: ago 2005
Posts: 101
Poder: 19
Maury Manosalva Va por buen camino
que BD Utilizas

Indicame que BD utilizas, tal vez te pueda ayudar..
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Error Con Fechas! nicolas_espina SQL 2 04-08-2006 01:18:19
Como trabajar con fechas y horas JULIPO MySQL 7 07-06-2006 17:01:34
DBGrid, trabajar con fechas BlueSteel Varios 4 02-09-2005 21:30:20
me hace falta un componente para trabajar con fechas y bases de datos fearlex Conexión con bases de datos 17 13-07-2004 23:37:28
Como trabajar con fechas? judoboy OOP 4 19-05-2003 11:28:58


La franja horaria es GMT +2. Ahora son las 20:51:22.


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
Copyright 1996-2007 Club Delphi