Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / lazarus-es / 2013-02

comparacion de fechas

7 messages · 4 people · –

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

Paola Bruccoleri

Hola todos..

me est� d evolviendo mal una comparaci�n cuando se que las fechas son iguales...

en un form pido mes y a�o

var
   dFecha, dFechaContrato, dFechaAux: TDate;
   dFechaReaj, dFechaReaj2, dFechaReaj3: TDate;
begin
.....
    dFecha:= EncodeDate(StrToInt(edtAnio.Text), StrToInt(cboMes.Text),
1); // 1er dia del mes
     (el campo finicio es tipo date, Firebird y uso componentes Zeos)
     dFechaContrato:= qryContratos.FieldByName('finicio').AsDateTime;
     if DayOf(dFechaContrato) = 1 then
       dFechaAux:= dFechaContrato
     else
       dFechaAux:= EndOfTheMonth(dFechaContrato) + 1;
     nMeses:= MonthsBetween(dFecha, dFechaAux) + 1;  (sumo 1 porque sino
entre 01/02/12 y 01/02/13 da 11 meses)
     if nMeses >= 12 then begin
       nAnios:= Trunc(nMeses/12);
       dFechaReaj:= IncYear(dFechaAux, nAnios);
        showmessage(datetostr(dfecha));
        showmessage(datetostr(dfechareaj));
       if dFecha = dFechaReaj then begin
             ......... // POR ACA NO PASA Y LAS FECHAS LAS MUESTRA IGUAL

alguna idea???

muchas gracias

Reply by email

Paola Bruccoleri
to Paola Bruccoleri

El 17/02/2013 04:40 p.m., Paola Bruccoleri escribi�:

Show quoted text 38 lines
Hola todos.. me est� d evolviendo mal una comparaci�n cuando se que las fechas son iguales... en un form pido mes y a�o var dFecha, dFechaContrato, dFechaAux: TDate; dFechaReaj, dFechaReaj2, dFechaReaj3: TDate; begin ..... dFecha:= EncodeDate(StrToInt(edtAnio.Text), StrToInt(cboMes.Text), 1); // 1er dia del mes (el campo finicio es tipo date, Firebird y uso componentes Zeos) dFechaContrato:= qryContratos.FieldByName('finicio').AsDateTime; if DayOf(dFechaContrato) = 1 then dFechaAux:= dFechaContrato else dFechaAux:= EndOfTheMonth(dFechaContrato) + 1; nMeses:= MonthsBetween(dFecha, dFechaAux) + 1; (sumo 1 porque sino entre 01/02/12 y 01/02/13 da 11 meses) if nMeses >= 12 then begin nAnios:= Trunc(nMeses/12); dFechaReaj:= IncYear(dFechaAux, nAnios); showmessage(datetostr(dfecha)); showmessage(datetostr(dfechareaj)); if dFecha = dFechaReaj then begin ......... // POR ACA NO PASA Y LAS FECHAS LAS MUESTRA IGUAL alguna idea???

reci�n descubro que la comparaci�n NO da cuando se hace esta cuenta, porque si no se hiciera todo funciona perfectamente. (o sea, con los contratos hechos el 1er d�a del mes)

dFechaAux:= EndOfTheMonth(dFechaContrato) + 1;

o sea, cuando la fecha de contrato no es el 1er d�a, que debo obtener el 1er d�a del mes siguiente....

si tengo como fecha 20/01/2012, dFechaAux deber�a ser 01/02/2012, le sumo 1 a�o: 01/02/2013 y no compara con dFecha que es 01/02/2013

la verdad.. no se porqu� falla esa cuenta!

------------ pr�xima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20130217/044879fe/attachment.html>

Reply by email

Paola Bruccoleri
to Paola Bruccoleri

El 17/02/2013 05:00 p.m., Paola Bruccoleri escribi�:

Show quoted text 53 lines
El 17/02/2013 04:40 p.m., Paola Bruccoleri escribi�: > Hola todos.. > > me est� d evolviendo mal una comparaci�n cuando se que las fechas son > iguales... > > en un form pido mes y a�o > > var > dFecha, dFechaContrato, dFechaAux: TDate; > dFechaReaj, dFechaReaj2, dFechaReaj3: TDate; > > begin > ..... > dFecha:= EncodeDate(StrToInt(edtAnio.Text), StrToInt(cboMes.Text), > 1); // 1er dia del mes > > (el campo finicio es tipo date, Firebird y uso componentes Zeos) > dFechaContrato:= qryContratos.FieldByName('finicio').AsDateTime; > if DayOf(dFechaContrato) = 1 then > dFechaAux:= dFechaContrato > else > dFechaAux:= EndOfTheMonth(dFechaContrato) + 1; > > nMeses:= MonthsBetween(dFecha, dFechaAux) + 1; (sumo 1 porque > sino entre 01/02/12 y 01/02/13 da 11 meses) > > if nMeses >= 12 then begin > nAnios:= Trunc(nMeses/12); > dFechaReaj:= IncYear(dFechaAux, nAnios); > > showmessage(datetostr(dfecha)); > showmessage(datetostr(dfechareaj)); > > if dFecha = dFechaReaj then begin > ......... // POR ACA NO PASA Y LAS FECHAS LAS MUESTRA IGUAL > > > alguna idea??? reci�n descubro que la comparaci�n NO da cuando se hace esta cuenta, porque si no se hiciera todo funciona perfectamente. (o sea, con los contratos hechos el 1er d�a del mes) dFechaAux:= EndOfTheMonth(dFechaContrato) + 1; o sea, cuando la fecha de contrato no es el 1er d�a, que debo obtener el 1er d�a del mes siguiente.... si tengo como fecha 20/01/2012, dFechaAux deber�a ser 01/02/2012, le sumo 1 a�o: 01/02/2013 y no compara con dFecha que es 01/02/2013 la verdad.. no se porqu� falla esa cuenta!
en cambio as� funciona bien:
StartOfTheMonth(IncMonth(dFechaContrato, 1));

claro... us� la funci�n datetimetostr() y veo que:

EndOfTheMonth(dFechaContrato) + 1; devuelve 01/02/2012 23:59:59 y
StartOfTheMonth(IncMonth(dFechaContrato, 1)); devuelve 01/02/2012

por eso la comparaci�n falla con los siguientes c�lculos al sumar 1 a�o, etc.

aunque ambas funciones devuelven TDateTime..

por el h�bito de sumar 1 a una fecha dada ya que funciona en otros lenguajes, es que lo hice aqu�. Ahora deber� revisar otras cuentas por las dudas

------------ pr�xima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20130217/9be14bde/attachment.html>

Reply by email

Maxi
to Paola Bruccoleri

el campo es del tipo fecha o fecha y hora? la fecha se representa como un valor con decimal, la parte entera son los a�os,meses,dias y la decimal las horas,min,seg,mseg.
Si es fecha y hora debes tener en cuenta esto o truncar los decimales.

El que pregunta aprende, y el que contesta aprende a responder. No a la obsolecencia programada: http://dimensionargentina.blogspot.com/2011/01/todo-esta-disenado-para-romperse.html Linux User #495070 http://domonetic.com/blog ------------ pr�xima parte ------------ Se ha borrado un adjunto en formato HTML... URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20130217/5720ac7f/attachment.html>

Reply by email

Antonio Évora
to Paola Bruccoleri: El 17/02/2013 05:00 p.m., Paola Bruccoleri escribi�: en cambio as� funciona bien:…

El 17/02/13 20:38, Paola Bruccoleri escribi�:

Show quoted text 10 lines
claro... us� la funci�n datetimetostr() y veo que: EndOfTheMonth(dFechaContrato) + 1; devuelve 01/02/2012 23:59:59 y StartOfTheMonth(IncMonth(dFechaContrato, 1)); devuelve 01/02/2012 por eso la comparaci�n falla con los siguientes c�lculos al sumar 1 a�o, etc. aunque ambas funciones devuelven TDateTime..

Hola Paola,
Yo en las funciones que tengo armadas uso un
strtodate(datetostr(Fecha)), en tu caso:
strtodate(datetostr(EndOfTheMonth(dFechaContrato) + 1)) Con esto las comparaciones las hace correctamente (que como comenta Maxi lo que hace es truncar la informaci�n referente a la hora)

Saludos.

Reply by email

Paola Bruccoleri
to Maxi: el campo es del tipo fecha o fecha y hora? la fecha se representa como un valor con…

El 18/02/2013 12:50 a.m., Maxi escribi�:

Show quoted text 5 lines
el campo es del tipo fecha o fecha y hora? la fecha se representa como un valor con decimal, la parte entera son los a�os,meses,dias y la decimal las horas,min,seg,mseg. Si es fecha y hora debes tener en cuenta esto o truncar los decimales.

Hola MAxi..
no, el campo fecha es solo DATE, NO DateTime...

------------ pr�xima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20130218/98da90f7/attachment.html>

Reply by email

José Mejuto
to Paola Bruccoleri

El 18/02/2013 11:34, Paola Bruccoleri escribi�:

Show quoted text 9 lines
El 18/02/2013 12:50 a.m., Maxi escribi�: > el campo es del tipo fecha o fecha y hora? la fecha se representa como > un valor con decimal, la parte entera son los a�os,meses,dias y la > decimal las horas,min,seg,mseg. > Si es fecha y hora debes tener en cuenta esto o truncar los decimales. > Hola MAxi.. no, el campo fecha es solo DATE, NO DateTime...

Hola,

TDate es un alias para TDateTime. Cuando operes con d�as recuerda truncar o redondear los resultados, me explico. El MonthsBetween casi seguro que te devuelve 11 meses, 30 d�as, 23 horas, 59 minutos, 59 segundos; si lo redondeas a d�as deber�a darte 12 meses, si lo truncas, s�lo 11 meses.

Para mi las funciones de fechas y horas de Delphi/FPC est�n mal planteadas y definidas, pero eso ya no tiene arreglo :) as� que tendremos que convivir con ello.

Reply by email