Дата в БД MySQL из DateTimePicker'a
в DateTimePicker1 из mySQL дата форматируется и переворачивается автоматически запросом:
...DATE_FORMAT(`from_date`, "%d.%m.%Y") as `from_date`,...
Но вот позже из DateTimePicker1 ни как не могу её перевернуть в формат mySQL, т.е. превратить из 27.02.2001 в 2001-02-27, она туда автоматически не переворачивается и получается 2027-02-20. Пытаюсь делать кодом:
ADOQuery1.SQL.add('UPDATE table_name SET `from_date`=DATE_FORMAT("'+DateToStr(DateTimePicker1.Date)+'",''%Y-%m-%d'') WHERE `number` = 1');
Пробовал перед SQL-запросом делать DateTimePicker1.Format:='yyyy-M-d'; не помогло.
Странная ситуация с форматом времени у разных платформ - неужели эта планета не может определиться с единым стандартом времени? Время ведь на планете одного исчисления. В общем отошёл от темы вопроса.
Как быть? Как записать в БД дату из DatePicker'а
Ответы (2 шт):
Как быть? Как записать в БД дату из DatePicker'а
Вариант 1:
Явно указать формат, заменив DateToStr(DateTimePicker1.Date) на FormatDateTime('yyyy-mm-dd', DateTimePicker1.Date)
Вариант 2:
Явно указать формат, заменив DateToStr(DateTimePicker1.Date) на перегруженный вариант DateToStr(DateTimePicker1.Date, MySQLFormatSettings)
При этом заранее нужно объявить переменную MySQLFormatSettings: TFormatSettings и установить у нее формат даты, и, желательно, десятичный разделитель.
Вариант 3:
Использовать параметрический запрос
ADOQuery1.SQL.add('UPDATE table_name SET `from_date`=:Date1 WHERE `number` = 1');
ADOQuery1.ParamByName('Date1').AsDate := DateTimePicker1.Date;
PS
Странная ситуация с форматом времени у разных платформ
Для внутреннего представления в программах всё чаще применяют ISO 8601: YYYY-MM-DD Он наиболее универсален.
неужели эта планета не может определиться с единым стандартом времени?
Нет, не может. Люди слишком привязаны к своей истории и культуре.
Время ведь на планете одного исчисления.
Вы несколько не осведомлены
Надо избегать преобразование строк в даты и обратно.
У DateTimePicker1 есть свойство DateTimе, которое указывает на введенное значение.
В запросах везде где только можно необходимо указывать параметры. Это снимет проблемы с преобразованием и проверкой типов. Также это позволяет БД лучше оптимизировать запросы.
ADOQuery1.Parameters.ParamByName('family').Value := DateTimePicker1.DateTimе;
У параметра должен быть тип ftDateTime, а сам запрос изменится на
UPDATE table_name
SET `from_date`= :p_date
WHERE `number` = :p_num