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')
Другие вопросы по тегам