对日期格式使用LOAD DATA INFILE的多个SET字段

问题描述:

我能够使用LOAD DATA INFILE成功获取我上传的csv文件。我可以跳过所有我不需要的数据/列(Manual 13.2.6对日期格式使用LOAD DATA INFILE的多个SET字段

我能够使用SET命令设置日期格式。我的问题是,如果我有多个日期字段,那么SET命令的任何变体与上面的结合都不想在我有多个SET时工作。

<?php 

if (isset($_POST['load'])) 
{ 
include '_inc/include.php'; 

$temp = $_FILES['myfile']['tmp_name']; 
$sqlstatement="LOAD DATA LOCAL INFILE '$temp' INTO TABLE 000_1616 FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\r\n' IGNORE 1 LINES (id, @somedate, name, anotherdate, color, 1moredate) SET sdate = IF(LENGTH(@somedate)=7,STR_TO_DATE(@somedate,'%m/%d/%Y'),STR_TO_DATE(@somedate,'%m/%d/%y'))"; 
mysql_query($sqlstatement) or die(mysql_error()); 

echo "It worked"; 
echo "<p><a href='upload-display.php'>go to page</a></p>"; 
} 

?> 

<form method="post" action="upload.php" enctype="multipart/form-data"> 
<input name="myfile" type="file" /> 
<input name="load" type="submit" value="submit" /></form> 

我的设置是这样的

SET sdate = IF(LENGTH(@somedate)=7,STR_TO_DATE(@somedate,'%m/%d/%Y'),STR_TO_DATE(@somedate,'%m/%d/%y'))"; 

$sqlstatement="LOAD DATA LOCAL INFILE '$temp' INTO TABLE 000_1616 FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\r\n' IGNORE 1 LINES (id, @somedate, name, anotherdate, color, 1moredate) SET sdate = IF(LENGTH(@somedate)=7,STR_TO_DATE(@somedate,'%m/%d/%Y'),STR_TO_DATE(@somedate,'%m/%d/%y'))"; 

我用@somedate第一次约会场这实在是SDATE。只要我不尝试使用SET添加4个更多的日期字段,这个效果很好。我想添加@anotherdate(anotherdate)和@ 1moredate(1moredate)我必须设置一个数组吗?我需要在phpMyADMIN方面的表中做些什么吗?现在它们被格式化为Date,但除了提交的第一个日期之外,它们都返回000-00-00。

这里是SQL:

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; 
SET time_zone = "+00:00"; 


/*!40101 SET @[email protected]@CHARACTER_SET_CLIENT */; 
/*!40101 SET @[email protected]@CHARACTER_SET_RESULTS */; 
/*!40101 SET @[email protected]@COLLATION_CONNECTION */; 
/*!40101 SET NAMES utf8 */; 

-- 
-- Database: `database_track` 
-- 

-- -------------------------------------------------------- 

-- 
-- Table structure for table `000_datetest` 
-- 

CREATE TABLE IF NOT EXISTS `000_datetest` (
    `id` int(11) NOT NULL auto_increment, 
    `sdate` date default NULL, 
    `name` varchar(100) collate utf8_unicode_ci default NULL, 
    `anotherdate` date NOT NULL, 
    `color` varchar(50) collate utf8_unicode_ci NOT NULL, 
    `1moredate` date NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=6 ; 

/*!40101 SET [email protected]_CHARACTER_SET_CLIENT */; 
/*!40101 SET [email protected]_CHARACTER_SET_RESULTS */; 
/*!40101 SET [email protected]_COLLATION_CONNECTION */; 

CSV例如:

+----+---------------+-------------------+---------------------+------------+-------------------+ 
| id | sdate   | name    | anotherdate  | color  | 1moredate  | 
+----+---------------+------------------------+---------------+------------+-------------------+ 
| 1 | 2011-08-21 | Tom Thumb | 08/16/2010  | Blue  | 1/5/08   | 
+----+---------------+------------------------+---------------+------------+-------------------+ 
| 1 | 2009-05-12 | Don Duck  | 03/22/2012  | Yellow | 9/15/03  | 
+----+---------------+------------------------+---------------+------------+-------------------+ 
1 row in set (0.00 sec) 

我希望这可以帮助,请参考下面

+0

你能提供表结构 - CREATE TABLE语句和CSV文件的例子吗? – Devart 2013-02-14 07:09:21

+0

是的,我不知道如何在这里上传它。转到此链接:http://muldoon.cc/010203/您可以测试表单并或单独下载ZIP或所有文件 – 2013-02-14 14:48:39

+0

它不是一个CSV文件,它是包含数据的简单文本文件。你应该跳过每一个奇数记录,但是LOAD DATA INFILE不能这样做。 – Devart 2013-02-18 08:40:55

在评论物理文件中使用与LOAD DATA多个SET命令INFILE你只需要指定一次SET,并用逗号分隔每个变量定义。

LOAD DATA INFILE 'my_file' INTO TABLE 'my_table' (column1, @date1, @date2) 
SET column2 = STR_TO_DATE(@date1, '%d/%m/%Y %H:%i:%s'), 
column3 = STR_TO_DATE(@date2, '%d/%m/%Y %H:%i:%s');