mysql str_to_date возвращает значение NULL
Задача
Я пытаюсь загрузить файл.csv с именем persondata в базу данных alldata TABLE persondata БД, а затем выполнить запрос для имени, фамилии и даты рождения (dob). В.csv есть только 4 записи.
Формат даты в формате csv - ММ / ДД / ГГГГ, выходные данные должны быть ГГГГ / ММ / ДД, ГГГГ-ММ-ДД или ГГГГММДД.
SQL
LOAD DATA LOCAL INFILE 'C:/Users/john.smith/Desktop/persondata.csv'
INTO TABLE alldata.persondata
FIELDS TERMINATED BY ','
(firstname, lastname, dob, apptdate, icd9, cpt)
SET dob = str_to_date(@dob, '%c/%e/%Y')
;
SELECT firstname, lastname, dob
FROM alldata.persondata
Проблема и сообщение об ошибке я получаю
firstname и lastname возвращают правильные значения, но dob возвращает null для всех 4 записей. В файле csv первые три столбца (A, B, C) - это имя, фамилия, dob. В том же порядке, что и в таблице persondata.
Ошибка:
4 строки затронуты, 8 предупреждений: 1265 Данные усечены для столбца "dob" в строке 1 1411 Неверное значение даты и времени: "19850708" для функции str_to_date 1265
Страницы справки, к которым я обращался:
(с использованием str_to_date в целом)
Как преобразовать формат даты CSV в MySQL DB
(используя 'SET column = str_to_date...')
MySql загрузки данных infile STR_TO_DATE возвращается пустым?
(Другой)
Как изменить строковую дату на формат даты MySQL во время импорта CSV, используя MySQL LOAD DATA LOCAL INFILE
Не удается преобразовать мм / дд / гггг в Excel в формат даты в формате csv ггггммдд с использованием служб SSIS
MySQL str_to_date выдает NULL несмотря на правильное форматирование
Дополнительная информация:
Я экспериментировал с этим запросом и множеством его вариантов, но не повезло:
SET dob = date_format (str_to_date (@dob, '% c /% e /% Y'), '% Y /% c /% e')
Я не вижу огромного консенсуса о том, как написать это. Некоторые люди указывают формат вывода%Y/%d/%m, а некоторые нет. Но разве это не единственный формат даты, который поддерживает mysql? Это заставляет меня думать, что я не должен был писать это. Не уверен, что это вообще связано. Я видел несколько синтаксисов всего этого. Я прочитал все страницы поддержки и думаю, что понимаю команду "SET".
* это мой первый пост на stackru, поэтому, пожалуйста, дайте мне знать, если что-то изменится
1 ответ
Вы используете "dob" там, где вы должны использовать "@dob" в списке столбцов... строка 4 должна быть:
(firstname, lastname, @dob, apptdate, icd9, cpt)
^^^^
Это связано с тем, что mysql считывает дату в переменную VARIABLE (обозначается символом @), а затем более поздняя команда SET манипулирует переменной, чтобы соответствовать фактическому столбцу (который идентифицирован правильно в dob без символа @).
Кроме того, я думаю, что вы используете косые черты в вашем строковом формате, когда дата не имеет косых черт. То есть ошибка говорит о том, что дата "19850708" (8 июля 1985 г.). Я верю, что вы хотите:
%Y%m%d
То есть измените строку 5 на:
SET dob = str_to_date(@dob, '%Y%m%d')
% m и%d - это двузначный месяц и день, которые вам нужны, например, если в июле у вас есть "07" вместо "7". После ваших комментариев я не уверен, какой формат даты правильный, но, безусловно, проблема с переменной @dob vs dob реальна. Возможно, вы захотите заменить каждый экземпляр @dob чем-то вроде @original_dob, чтобы облегчить путаницу в будущем.
Смотрите эту страницу: http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html