Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Problem TDate/TDataTime >zu> Integer >zu> String (https://www.delphipraxis.net/178994-problem-tdate-tdatatime-zu-integer-zu-string.html)

süden 7. Feb 2014 11:24

Delphi-Version: 5

Problem TDate/TDataTime >zu> Integer >zu> String
 
Hallo,

In meinem Programm werde Datumwerte als [Datum] Integer / [Std] Integer + [Min] Integer in der Datenbank gespeichert.
Das habe ich gemacht weil Datum und Zeit immer wieder zerlegt werden müssten.
Die Eingabe des Nutzers werden getrennt 1) Datum 2) von/bis als Std/Min.

Jetzt brauche ich die Stundenwerte des letzten Monats:

Code:
function DaysOfMonth(ADate:TDate; corrMonth):String;
...
    DecodeDate(ADate, Year,Month,Day);
    IncAMonth(Year,Month,Day,corrMonth);
    dtA := EncodeDate(Year,Month,1);
    dtE := EndOfAMonth(Year,Month);
dtA zeigt 41640 = 01.01.2014
dtE zeigt 41671 = 01.02.2014 - in den SQL_String kommt:

Code:
Result := ' (('+DateField+' >= '+sdtA+') AND ('+DateField+' < '+sdtE+')) ';
Ich wandele also die TDate-Werte in Strings um.
Code:
sdtE := IntToStr(Trunc(dtE));
dtE = 41671 !!!
sdtE = 41670 !!!

Es werden nur die Datumsanteile benutzt und Ganzzahlen angezeigt.

Wie kann das sein?
Welche Möglichkeiten gibt es das zu vermeiden?

himitsu 7. Feb 2014 12:31

AW: Problem TDate/TDataTime >zu> Integer >zu> String
 
Ich hab garnicht verstanden, was du überhaupt willst und wo das Problem ist?

Die großen Zahlen sind natürlich das, was man auch in der Beschreibung zu Delphi-Referenz durchsuchenTDateTime lesen kann. (Tage seit einem bestimmten Datum)

Ich glaub jetzt hab ich's verstanden.

Wie ist denn EndOfAMonth im D2007 deklariert?
Vielleicht ist da ja ein Bug drin. Und die Delphi-Updates hast du auch installiert? (nicht daß der vermeintliche Bug schon behoben wurde)

In aktuelleren Delphis geht das zumindestens:
Delphi-Quellcode:
ShowMessage(DateToStr(41640) + ' ' + DateToStr(41671) + sLineBreak +
  DateToStr(EncodeDate(2014, 01, 01)) + ' ' + DateToStr(EndOfAMonth(2014, 01)));



Info für Andere, welche hier mitlesen:
Statt Trunc besser Delphi-Referenz durchsuchenDateOf verwenden.
Delphi-Quellcode:
function DaysOfMonth(ADate: TDate; CorrMonth: Integer): String;
...
    CDate := IncMonth(ADate, CorrMonth);
    dtA := StartOfTheMonth(CDate);
    dtE := EndOfTheMonth(CDate);

Sherlock 7. Feb 2014 14:07

AW: Problem TDate/TDataTime >zu> Integer >zu> String
 
Zitat:

Delphi Version:5
Das ist...übel. :pale:

Davon ab, daß die Speicherung der DateTimes als...Konstrukt auch schon übel war. Schlimm, daß sich sowas immer erst Jahre später rächt, und nicht sofort.

Sherlock

p80286 7. Feb 2014 14:32

AW: Problem TDate/TDataTime >zu> Integer >zu> String
 
Könnte es sein, das hier ein Mißverständnis vorliegt?

Code:
dummy:=endofamonth(2014,01);
  caption:=inttostr(trunc(dummy))+' = '+datetimetostr(dummy);
41670 = 31.01.2014 23:59:59

41671 wäre "Startofamonth" ??

Gruß
K-H


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:47 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz