SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 17.01.2013 16:58:12

Leha123ra
Участник
Откуда: Санкт-Петербург
Зарегистрирован: 17.01.2013
Сообщений: 2

Триггер и STR_TO_DATE. Как реализовать?

Добрый день.
Помогите, пожалуйста, разобраться, почему вот такое не работает:

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

Неактивен

 

#2 17.01.2013 17:51:33

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Триггер и STR_TO_DATE. Как реализовать?

Так реализовать не получится. Дело в том, что триггер вызывается тогда, когда строка уже преобразована к типу date '17.01.2013' уже превращена в 2017-01-20. Над этим значением STR_TO_DATE() дает NULL. Если вставляете данные в колонку типа DATE, нужно заранее привести в подходящий формат '2013-01-17'.

Неактивен

 

#3 17.01.2013 22:26:36

Leha123ra
Участник
Откуда: Санкт-Петербург
Зарегистрирован: 17.01.2013
Сообщений: 2

Re: Триггер и STR_TO_DATE. Как реализовать?

Спасибо за ответ!
Только я не совсем понял, в какой момент данные из СТРОЧНЫХ преобразуются в ДАТУ.
Из софта они выходят строчкой. Их ODBC сервер преобразует в DATE?
Правильно я понимаю, что прежде, чем попасть в мою таблицу вообще и в триггер в частности, они уже имеют вид 2017-01-20?
Тогда их нигде не отловить для конвертации, так получается? Ни триггером, ни процедурой, ни чем-то ещё?
Нужно создавать буферную таблицу, где SD_DATE имеет тип varchar, записывать в неё всю строку данных, которая приходит из софта, а затем уже переносить в некую основную рабочую таблицу, по пути преобразовывая тип данных и формат представления даты (всё той же STR_TO_DATE())?

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson