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

b.i*_*b.i 8 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';
Run Code Online (Sandbox Code Playgroud)

但我的一个专栏是日期,它是作为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
Run Code Online (Sandbox Code Playgroud)

fan*_*nts 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');
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅LOAD DATASTR_TO_DATE

注意:我删除了FIELDS TERMINATED BY ',' ENCLOSED BY '"'部分,因为我既没有看到,也没有看到"你的CSV.但如果它按照它的方式工作正常,请随意恢复:)


Álv*_*lez 6

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

mysql> SELECT @@date_format;
+---------------+
| @@date_format |
+---------------+
| %Y-%m-%d      |
+---------------+
Run Code Online (Sandbox Code Playgroud)

...因此 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');
Run Code Online (Sandbox Code Playgroud)

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

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

正如MySQL 5.6 手册所解释的那样

此变量未使用。它从 MySQL 5.6.7 开始被弃用,并将在未来的 MySQL 版本中删除。

此外,在日期和时间类型中,我们可以阅读:

MySQL 以标准输出格式检索给定日期或时间类型的值,但它尝试解释您提供的输入值的各种格式(例如,当您指定要分配给日期或与日期或时间类型)。有关日期和时间类型允许的格式的说明,请参阅第 10.1.3 节,“日期和时间文字”。预计您提供有效值。如果您使用其他格式的值,可能会出现不可预测的结果。

尽管 MySQL 尝试以多种格式解释值,但日期部分必须始终按年-月-日顺序给出(例如,'98-09-04'),而不是按月-日-年或日-月-其他地方常用的年份命令(例如,'09-04-98'、'04-09-98')。