Come regola generale, non trattare i valori di TDateTime come stringhe, ma come date e ore.
Non ottenere il valore di un campo Date/Time con il metodo AsString, utilizzare il metodo AsDateTime e assegnarlo a una variabile TDateTime.
Se vuoi conoscere le parti della data, usa le funzioni fornite per farlo. Ad esempio quelli disponibili in DateUtils unità. Il SysUtils l'unità contiene anche alcune funzioni relative a Data/Ora.
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]);
Lo stesso vale per la memorizzazione di valori nel database, invece di utilizzare un formato di data fisso, utilizzare parametri, come questo:
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();
Funziona con tutti i livelli di accesso al database disponibili che conosco.