从csv导入mysql as 0000-00-00的日期

时间:2013-01-28 09:40:00

标签: mysql csv import

我将一些数据保存为txt文件。我将txt文件保存为csv,以便使用我的sql workbench将其导入数据库。  我正在做的是以下内容:

LOAD DATA LOCAL INFILE '/path/to/csv/file.csv' INTO TABLE mytable FIELDS TERMINATED BY ',' ENCLOSED BY '"' lines terminated by '\n';

但是我的一个专栏是一个日期,它是作为0000-00-00导入的

如何以良好的方式导入它? 的修改 这是我的csv包含的内容:

id  task    hoursWorked begindate   enddate                         
0   task1   15  11/17/2012          11/18/2012                          
1   task2   20  11/18/2012          11/20/2012                          
2   task3   20  12/4/2012           12/5/2013                           
3   task4   22  1/5/2013            1/7/2013

3 个答案:

答案 0 :(得分:11)

请试试这个:

LOAD DATA LOCAL INFILE '/path/to/csv/file.csv' 
INTO TABLE mytable 
LINES TERMINATED BY '\n'
(id, task, hoursWorked, @var1, @var2) 
SET begindate = STR_TO_DATE(@var1, '%m/%d/%Y'),     
enddate = STR_TO_DATE(@var2, '%m/%d/%Y');

有关详细信息,请参阅LOAD DATASTR_TO_DATE

注意:我删除了FIELDS TERMINATED BY ',' ENCLOSED BY '"'部分,因为我在CSV中既未看到,也未看到"。但如果它按照它的方式正常工作,请随时回复:)

答案 1 :(得分:4)

默认日期格式为YYYY-MM-DD

mysql> SELECT @@date_format;
+---------------+
| @@date_format |
+---------------+
| %Y-%m-%d      |
+---------------+

...因此MySQL不会将11/17/2012之类的内容识别为正确的日期。 理论上,您应该能够更改默认格式,但我不确定它是否可以在会话范围内完成,我不建议为整个服务器更改它。最好自己进行转换。诀窍是将值插入变量而不是列。

此外,还有另外两个问题:

  • 您的CSV文件包含标题行。
  • 您的字段,分隔。

假设您的文件使用制表符作为分隔符,则完整命令将为:

LOAD DATA LOCAL INFILE '/path/to/csv/file.csv'
INTO TABLE mytable
FIELDS TERMINATED BY '\t' ENCLOSED BY '"' LINES TERMINATED BY '\n'
IGNORE 1 LINES
(id, task, hoursWorked, @tmp_begindate, @tmp_enddate)
SET begindate = STR_TO_DATE(@tmp_begindate, '%m/%d/%Y'),
    enddate = STR_TO_DATE(@tmp_enddate, '%m/%d/%Y');

MySQL实际上不允许更改@@date_format

mysql> SET @@date_format='%d/%m/%Y';
ERROR 1238 (HY000): Variable 'date_format' is a read only variable

作为MySQL 5.6 manual explains

  

此变量未使用。从MySQL 5.6.7开始不推荐使用它   在将来的MySQL版本中删除。

此外,在Date and Time Types,我们可以阅读:

  

MySQL检索标准中给定日期或时间类型的值   输出格式,但尝试解释各种格式   您提供的输入值(例如,当您指定值时)   被分配或与日期或时间类型比较)。有描述   日期和时间类型的允许格式,请参阅Section 10.1.3, “Date and Time Literals”。预计您提供有效值。   如果您使用其他格式的值,可能会出现不可预测的结果。

     

虽然MySQL试图以多种格式解释值,但日期   零件必须始终以年 - 月 - 日的顺序给出(例如,   '98 -09-04'),而不是在月 - 日 - 年或日 - 月 - 年   其他地方常用的订单(例如,'09 -04-98','04 -09-98')。

答案 2 :(得分:1)

如果不起作用,只需将CVS中的年,月和日以及日期的年,月和年分别添加列,然后使用以下命令:

set date_column = concat(@year , '-' , @month , '-' , @day)