Som en generel regel skal du ikke behandle TDateTime-værdier som strenge, men som datoer og klokkeslæt.
Få ikke værdien af et Date/Time-felt med AsString-metoden, brug AsDateTime-metoden og tildel den til en TDateTime-variabel.
Hvis du vil kende datodelene, skal du bruge de medfølgende funktioner til at gøre det. For eksempel dem, der er tilgængelige i DateUtils enhed. SysUtils enhed indeholder også nogle dato/klokkeslæt relaterede funktioner.
uses
DateUtils, SysUtils;
var
MyDate: TDateTime;
MyDay, MyMonth, MyYear: Word;
begin
MyDate := MyQuery.Fields[3].AsDateTime; //not AsString
MyDay := DayOf(MyDate);
MyMonth := MonthOf(MyDate);
MyYear := YearOf(MyDate);
ShowMessage(Format('Day: %d, Month: %d, Year: %d', [MyDay, MyMonth, MyYear]);
//or also
MyDate := EndOfTheMonth(MyDate);
DecodeDate(MyDate, MyYear, MyMonth, MyDay);
ShowMessage(Format('Day: %d, Month: %d, Year: %d', [MyDay, MyMonth, MyYear]);
Det samme gælder for lagring af værdier til databasen, i stedet for at bruge et fast datoformat, brug parametre som dette:
uses
DateUtils, SysUtils;
var
MyDate: TDateTime;
MyDay, MyMonth, MyYear: Word;
begin
MyDate := EncodeDate(2013, 2, 17);
MyQuery.SQL.Text := 'insert into myTable (MyDate) values (:MyDate)';
MyQuery.Params.ParamByName('MyDate').AsDateTime := MyDate;
MyQuery.ExecSQL();
Det virker med alle de tilgængelige databaseadgangslag, som jeg kender til.