У меня есть этот стол. В таблице есть несколько полей char, но рассматриваемое поле (expiredate) содержит char в таблице test_tmp и datetime в тестовой таблице. (Имена таблиц были изменены для защиты клиентов.)
В таблице test_tmp поле содержит пару месяц-дата, например «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.