STR_TO_DATE и проблема форматирования LOAD DATA INFILE
Что ж, спасибо всем за помощь. Похоже, это был неэкранированный символ в формате даты: "%%d/%%m/%%Y %%H:%%i" - это то, что мне нужно. Так как это запускается из командного файла, я не принял это во внимание.
У меня есть пакетный файл, который запускает команду SQL, и я подумал, что понял, что требуется, но, похоже, не могу все это объединить. Когда я запускаю приведенный ниже код, я получаю все для правильного импорта, но либо мое форматирование STR_TO_DATE должно быть отключено, либо способ, которым я нацеливаюсь на второй столбец, должен быть отключен, так как я просто получаю "(NULL)" или все нули в моем Столбец DATETIME, когда я запускаю скрипт ниже.
Вот скриншот того, что я вижу из окна командной строки. Подозрительная часть выделена зеленым цветом: http://i.imgur.com/TztR31p.png?1
Есть идеи?
CREATE TABLE `serials` (
`Serial` INT(10) UNSIGNED NULL DEFAULT '0',
`Stamp` DATETIME NULL DEFAULT NULL,
`Data1` MEDIUMINT(8) UNSIGNED NULL DEFAULT '0',
`Data2` MEDIUMINT(8) UNSIGNED NULL DEFAULT '0',
`Data3` MEDIUMINT(8) UNSIGNED NULL DEFAULT '0',
`Data4` MEDIUMINT(8) UNSIGNED NULL DEFAULT '0',
`Data5` MEDIUMINT(8) UNSIGNED NULL DEFAULT '0',
`Data6` MEDIUMINT(8) UNSIGNED NULL DEFAULT '0',
`Data7` MEDIUMINT(8) UNSIGNED NULL DEFAULT '0',
`Data8` MEDIUMINT(8) UNSIGNED NULL DEFAULT '0',
INDEX `StampINX` (`Stamp`),
INDEX `SerialINX` (`Serial`)
)
COLLATE='latin1_swedish_ci'
ENGINE=MyISAM;
echo on
setlocal enabledelayedexpansion
FOR %%f IN ("*.csv") DO (
set old=%%~dpnxf
set new=!old:\=\\!
mysql -e "LOAD DATA local INFILE '"!new!"' IGNORE into table test.serials COLUMNS TERMINATED BY ','
(Serial,@Stamp,Data1,Data2,Data3,Data4,Data5,Data6,Data7,Data8) SET
Stamp=STR_TO_DATE(@Stamp,'%d/%m/%Y %H:%i')" -u root -ppassword
echo %%~nxf DONE
)
ниже приведен пример файла, к которому я обращаюсь с помощью функции LOAD DATA INFILE
Serial,Stamp,Data1,Data2,Data3,Data4,Data5,Data6,Data7,Data8
50183,01/01/2012 00:15,0,77,73,84,0,0,3,62
50183,01/01/2012 00:30,0,100,45,77,0,0,3,67
50183,01/01/2012 00:45,0,96,62,73,0,0,2,61
50183,01/01/2012 01:00,0,81,79,85,0,0,3,56
2 ответа
Ваш формат строки для STR_TO_DATE
должно быть:
%d/%m/%Y %H:%i
Вы пропустили косые черты.
Как сказал Майк Брант, вам не хватает косой черты.
Кроме того, 4-значный год %Y
не %y
,
Иногда с этим типом проекта полезно загружать данные в строковый столбец в MySQL сначала в тестовой таблице, затем вы можете проверить функции, чтобы убедиться, что они преобразуют значения по желанию.
Вы также можете легко проверить одно значение, чтобы убедиться, что формат даты правильный:
mysql > \W
Show warnings enabled.
mysql > select str_to_date('01/01/2012 01:00','%d%m%y %H:%i');
+------------------------------------------------+
| str_to_date('01/01/2012 01:00','%d%m%y %H:%i') |
+------------------------------------------------+
| NULL |
+------------------------------------------------+
1 row in set, 1 warning (0.00 sec)
Warning (Code 1411): Incorrect datetime value: '01/01/2012 01:00' for function str_to_date
mysql > select str_to_date('01/01/2012 01:00','%d/%m/%y %H:%i');
+--------------------------------------------------+
| str_to_date('01/01/2012 01:00','%d/%m/%y %H:%i') |
+--------------------------------------------------+
| NULL |
+--------------------------------------------------+
1 row in set, 1 warning (0.00 sec)
Warning (Code 1411): Incorrect datetime value: '01/01/2012 01:00' for function str_to_date
mysql > select str_to_date('01/01/2012 01:00','%d/%m/%Y %H:%i');
+--------------------------------------------------+
| str_to_date('01/01/2012 01:00','%d/%m/%Y %H:%i') |
+--------------------------------------------------+
| 2012-01-01 01:00:00 |
+--------------------------------------------------+
1 row in set (0.00 sec)
Это должно работать для вас:
SET Stamp=STR_TO_DATE(@Stamp,'%d/%m/%Y %H:%i')