Задавайте вопросы, мы ответим
Вы не зашли.
Добрый день.
Помогите, пожалуйста, разобраться, почему вот такое не работает:
DELIMITER $$
USE `DB_name`$$
CREATE
DEFINER=`root`@`localhost`
TRIGGER `DB_name`.`change_data_format`
BEFORE INSERT ON `DB_name`.`TABLE_name`
FOR EACH ROW
BEGIN
SET NEW.SD_DATE = (SELECT STR_TO_DATE(NEW.SD_DATE,'%d.%m.%Y'));
END$$
Через ODBC сервер в MySQL транслируются данные. По логам видно, что ODBC говорит MySQL:
INSERT INTO DB_name.TABLE_name (SD_DATE, SD_TIME) VALUES ('17.01.2013', '16:31:33');
В доке к софту, из которого идёт экспорт написано, что переменная даты имеет тип varchar(12).
Я хочу, чтобы в моей таблице дата хранилась в формате MySQL, соответственно поле SD_DATE имеет тип DATE. Наваял вышеприведённый триггер. Но он возвращает NULL.
Дело в том, что я не могу понять, где ошибка, потому что функция STR_TO_DATE всегда возвращает NULL, если ей что-то не нравится. (да и вообще, можно ли так делать? пример записи нашёл тут в комментах.
Варианты, которые я пробовал:
SET NEW.SD_DATE = STR_TO_DATE(NEW.SD_DATE,'%d.%m.%Y');
SET NEW.SD_DATE = STR_TO_DATE('NEW.SD_DATE','%d.%m.%Y');
SET NEW.SD_DATE = (SELECT STR_TO_DATE('NEW.SD_DATE','%d.%m.%Y'))
SET NEW.SD_DATE = SELECT STR_TO_DATE('NEW.SD_DATE','%d.%m.%Y') с кавычками и без. (их сервер не ест вообще, возвращает ошибку синтаксиса.)
Изучаю MySQL неделю всего. До этого опыт программирования только в институте.
Заранее благодарю.
P.S. версия сервера 5.5.28
Неактивен
Так реализовать не получится. Дело в том, что триггер вызывается тогда, когда строка уже преобразована к типу date '17.01.2013' уже превращена в 2017-01-20. Над этим значением STR_TO_DATE() дает NULL. Если вставляете данные в колонку типа DATE, нужно заранее привести в подходящий формат '2013-01-17'.
Неактивен
Спасибо за ответ!
Только я не совсем понял, в какой момент данные из СТРОЧНЫХ преобразуются в ДАТУ.
Из софта они выходят строчкой. Их ODBC сервер преобразует в DATE?
Правильно я понимаю, что прежде, чем попасть в мою таблицу вообще и в триггер в частности, они уже имеют вид 2017-01-20?
Тогда их нигде не отловить для конвертации, так получается? Ни триггером, ни процедурой, ни чем-то ещё?
Нужно создавать буферную таблицу, где SD_DATE имеет тип varchar, записывать в неё всю строку данных, которая приходит из софта, а затем уже переносить в некую основную рабочую таблицу, по пути преобразовывая тип данных и формат представления даты (всё той же STR_TO_DATE())?
Неактивен