2015-06-19 54 views
0

恩,谢谢大家的帮助。看起来它是日期格式中的未转义字符:'%% d/%% m/%% Y %% H:%% i'是我所需要的。由于这是从批处理文件运行的,因此我没有考虑到这一点。STR_TO_DATE和LOAD DATA INFILE格式化问题

我有一个运行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 

回答

0

STR_TO_DATE你的字符串格式应该是:

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

你失踪斜线。

+0

见这就是我在一个点上想太多,但我仍然得到相同的结果。关于这方面的文档看起来很清楚,我可以告诉。我只是针对第二列不正确? – JubJub24

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') 
+0

再次添加了斜杠,甚至将%y换成%Y但仍然在同一条船上。我将更新我的原始问题以包含创建表代码。以及尝试你的其他建议。感谢帮助。 – JubJub24

+0

我发布了运行脚本时命令提示符显示内容的截图。我不得不模糊一些东西,但我也用绿色突出显示了我觉得可疑的部分:http://i.imgur.com/TztR31p.png?1 – JubJub24