我将一些数据保存为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
答案 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 DATA和STR_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
之类的内容识别为正确的日期。 理论上,您应该能够更改默认格式,但我不确定它是否可以在会话范围内完成,我不建议为整个服务器更改它。最好自己进行转换。诀窍是将值插入变量而不是列。
此外,还有另外两个问题:
,
分隔。假设您的文件使用制表符作为分隔符,则完整命令将为:
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.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)