Como regla general, no trate los valores de TDateTime como cadenas, sino como fechas y horas.
No obtenga el valor de un campo Fecha/Hora con el método AsString, use el método AsDateTime y asígnelo a una variable TDateTime.
Si desea conocer las partes de la fecha, utilice las funciones proporcionadas para hacerlo. Por ejemplo los disponibles en el DateUtils unidad. El SysUtils la unidad también contiene algunas funciones relacionadas con la fecha y la hora.
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 mismo se aplica al almacenamiento de valores en la base de datos, en lugar de usar un formato de fecha fijo, use parámetros como este:
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();
Funciona con todas las capas de acceso a bases de datos disponibles que conozco.