У меня есть эта таблица. В таблице есть куча полей char, но соответствующее поле (expiredate) содержит char в таблице test_tmp и дату и время в тестовой таблице. (Имена таблиц были изменены для защиты клиентов.)
В таблице test_tmp поле содержит пару Month-Date, например "10 августа" или "20 февраля". Код для ввода данных:
INSERT IGNORE INTO test (RECNUM, ORDERNUM, CREATEDATE, EXPIREDATE, FNAME, LNAME)
SELECT RECNUM, ORDERNUM, CREATEDATE,
CAST(CASE WHEN str_to_date(concat(expiredate, ' ', year(now())), '%b %d %Y') <= CURDATE()
THEN str_to_date(concat(expiredate, ' ', 1+year(now())), '%b %d %Y')
ELSE str_to_date(concat(expiredate, ' ', year(now())), '%b %d %Y') END AS DATETIME) AS EXPIREDATE, FNAME, LNAME FROM test_tmp
Что действительно озадачивает то, что если я запустил раздел SELECT, все будет выглядеть нормально. Но если я запустил все это (сначала обрезая тестовую таблицу), каждая строка содержит NULL в expiredate.
Ну, я только что нашел ответ на свой вопрос, наконец.
Обратите внимание, как я положил тег 'drupal' на вопрос? Запрос проходил через Drupal... который требует от вас избежать символа%, если вы не хотите, чтобы он использовался для замены данных. Итак, str_to_date(concat(expiredate, ' ', year(now())), '%b %d %Y')
на самом деле должно быть str_to_date(concat(expiredate, ' ', year(now())), '%%b %%d %%Y')
.
Спасибо за предложения, ребята.
К сожалению, я не могу оставлять комментарии. Вот почему я должен написать здесь.
В конце SQL-запроса у вас есть ")". Может быть, больше вырезано, когда вы копируете/вставляете этот код?
Вы получаете сообщения об ошибках?
Не могли бы вы оставить IGNORE и посмотреть, есть ли у вас какие-либо сообщения?
В соответствии с веб-сайт MySQL: Преобразования данных, которые будут приводить к ошибкам, прерывают утверждение, если IGNORE не указан. С IGNORE недопустимые значения корректируются до ближайших значений и вставляются; появляются предупреждения, но утверждение не прерывается.
Такая корректировка может произойти в вашем случае. Какое поле это истекает точно?
Чтобы проверить ваш запрос, я выполнил следующее:
SELECT CAST(CASE WHEN str_to_date(concat('Jan 5', ' ', year(now())), '%b %d %Y') <= CURDATE()
THEN str_to_date(concat('Jan 5', ' ', 1+year(now())), '%b %d %Y')
ELSE str_to_date(concat('Jan 5', ' ', year(now())), '%b %d %Y') END AS DATETIME) AS EXPIREDATE;
Все прошло отлично. Чтобы убедиться, что EXPIREDATE должен быть в форме "Янв 5" и т.д., Иначе NULL будет получен с ошибкой str_to_date.