2015-06-19 118 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