Почему эта таблица mysql выдает NULL в поле datetime? - PullRequest
0 голосов
/ 27 июня 2009

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

Ответы [ 4 ]

2 голосов
/ 27 июня 2009

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

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

1 голос
/ 27 июня 2009

Получаете ли вы какие-либо сообщения об ошибках?

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

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

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

0 голосов
/ 30 июня 2009

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

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

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

0 голосов
/ 27 июня 2009

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

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...