Miałem podobne problemy kiedyś raz działało a raz nie. U mnie pomogło zadeklarowanie stałych formatów np daty które używamy w programie.
Ojojoj... to pewnie i zadziała, ale to jest taki drut że aż zęby bolą...
Naprawdę nigdy nie słyszałeś o parametrach w zapytaniach?
{Wyłacz połaczenie system-aplikacja odnośnie zmian dokonywanych w Panelu Sterowania}
Application.UpdateFormatSettings := False;
{Ustaw własne formaty na których będzie pracować aplikacja}
DateSeparator := '-';
ShortDateFormat := 'dd-MM-yyyy';
LongDateFormat := 'dd-MMMM-yyyy';
ShortTimeFormat := 'hh:mm:ss';
LongTimeFormat := 'hh:mm:ss';
DecimalSeparator := ',';
TimeSeparator := ':';
Można i tak, ale to się czkawką odbije - prędzej czy później.
Poza tym jest ogromna szansa że tak potraktowane zapytanie będzie działało po prostu wolno.
Pytanie też jaki konkretnie format przyjmuje serwer.
Komunikat który ty otrzymujesz to niepowodzenie zamienienia varchar na datetime
Możesz także nie wiem czy w mssgl-u ale w mysql tak jest że datę możesz podać w formie liczby typu integer np poleceniem: FROM_UNIXTIME()
To w ogóle nie ma znaczenia, gdyż poprawnie powinno robić się to tak (szkoda tylko, ze pytacz nie podał jakich komponentów używa, ale sądzę że ADO):
//-- przygotowanie ADOCommand do przetwarzania zapytania; wykonywać tylko raz, przed pierwszym wykonaniem zapytania
ADOCommand1.CommandText := 'update nazwa_tabeli set data = :data';
ADOCommand1.Parameters.ParamByName('data').DataType := ftDateTime;
ADOCommand1.Prepared := True;
//-- Wykonanie zapytania - raz przygotowane zapytanie może być wielokrotnie wykonane,
//-- również w pętli gdzie przy każdej iteracji będzie inna wartość parametru
ADOCommand1.Parameters.ParamByName('data')Value := Now;
ADOCommand1.Execute;