STR_TO_DATE和LOAD DATA INFILE格式问题

时间:2015-06-19 16:00:52

标签: mysql sql load-data-infile str-to-date

好的,谢谢大家的帮助。看起来它在日期格式中是一个未转义的字符:'%% 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 个答案:

答案 0 :(得分:0)

STR_TO_DATE的字符串格式应为:

%d/%m/%Y %H:%i

你错过了斜杠。

答案 1 :(得分:0)

正如迈克布兰特所说,你错过了斜线。

此外,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')