En règle générale, ne traitez pas les valeurs TDateTime comme des chaînes, mais comme des dates et des heures.
N'obtenez pas la valeur d'un champ Date/Heure avec la méthode AsString, utilisez la méthode AsDateTime et affectez-la à une variable TDateTime.
Si vous souhaitez connaître les parties de la date, utilisez les fonctions fournies pour le faire. Par exemple ceux disponibles dans DateUtils unité. Le SysUtils l'unité contient également des fonctions liées à la date/heure.
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]);
Il en va de même pour le stockage des valeurs dans la base de données, plutôt que d'utiliser un format de date fixe, utilisez des paramètres, comme ceci :
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();
Cela fonctionne avec toutes les couches d'accès à la base de données disponibles que je connais.