Почему эта таблица mysql выдает NULL в поле datetime?

0

У меня есть эта таблица. В таблице есть куча полей 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
null

4 ответа

0
Лучший ответ

Ну, я только что нашел ответ на свой вопрос, наконец.

Обратите внимание, как я положил тег 'drupal' на вопрос? Запрос проходил через Drupal... который требует от вас избежать символа%, если вы не хотите, чтобы он использовался для замены данных. Итак, str_to_date(concat(expiredate, ' ', year(now())), '%b %d %Y') на самом деле должно быть str_to_date(concat(expiredate, ' ', year(now())), '%%b %%d %%Y').

Спасибо за предложения, ребята.

2

К сожалению, я не могу оставлять комментарии. Вот почему я должен написать здесь.

В конце SQL-запроса у вас есть ")". Может быть, больше вырезано, когда вы копируете/вставляете этот код?

  • 0
    Да спасибо. Я исправил это.
1

Вы получаете сообщения об ошибках?

Не могли бы вы оставить IGNORE и посмотреть, есть ли у вас какие-либо сообщения?

В соответствии с веб-сайт MySQL: Преобразования данных, которые будут приводить к ошибкам, прерывают утверждение, если IGNORE не указан. С IGNORE недопустимые значения корректируются до ближайших значений и вставляются; появляются предупреждения, но утверждение не прерывается.

Такая корректировка может произойти в вашем случае. Какое поле это истекает точно?

  • 0
    Я не забываю запускать его без IGNORE один раз и не замечать никаких ошибок, но я попробую это снова в понедельник. expiredate в исходной таблице имеет значение MMM DD, например «10 августа», expiredate в целевой таблице представляет собой поле даты и времени.
0

Чтобы проверить ваш запрос, я выполнил следующее:

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.

  • 0
    Да, когда я запускаю запрос SELECT для данных, я определенно получаю хорошие даты.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню