【问题标题】:Date imported from csv into mysql as 0000-00-00从 csv 导入 mysql 的日期为 0000-00-00
【发布时间】:2013-01-11 14:57:47
【问题描述】:

我有一些数据保存为 txt 文件。我将 txt 文件保存为 csv,以便使用我的 sql 工作台将其导入数据库。 我正在做的事情如下:

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

【问题讨论】:

  • 您已经省略了字段内容和列定义...您可以编辑问题并提供它们吗?
  • 您能否提供一小段 CSV 文件,以便我们查看日期格式以及您要存储日期的 mysql 字段的类型。
  • 无效或格式错误的日期被导入为0000-00-00。您可以在LOAD DATA 期间将您的日期格式化为yyyy-mm-dd(该选项无法帮助您)。或者您可以修改您的 csv 文件以使用正则表达式格式化您的日期。 (有很多关于使用正则表达式格式化日期的例子。)
  • 你的字段不是TERMINATED BY ','... :-?
  • @ Álvaro G. Vicario:除了 begindate 和 enddate 中的值外,一切都正常工作

标签: mysql csv import


【解决方案1】:

请试试这个:

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 中既没有看到 , 也没有看到 "。但是,如果它对您来说效果很好,请随时恢复:)

【讨论】:

  • 这意味着我必须单独转换 begindate 和 enddate 中的每个值?但我有一百个价值观!
  • 一百并不多,这应该不会太糟糕。请试一试。
  • 另外,我相信这是最好的方法(如果您不想手动弄乱 CSV,也是唯一的方法)。
  • +1 这是正确答案,比我的早 15 分钟发布:)
  • 我写了上面的查询,但它给了我一个错误:你的 SQL 语法有错误;查看与您的 MySQL 服务器版本相对应的手册,了解在第 1 行的“LINEs”附近使用的正确语法
【解决方案2】:

默认日期格式为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 尝试以多种格式解释值,但 date 零件必须始终按年月日顺序给出(例如, '98-09-04'),而不是在月-日-年或日-月-年 其他地方常用的订单(例如,'09-04-98'、'04-09-98')。

【讨论】:

    【解决方案3】:

    如果它不起作用,只需在您的 CVS 中添加年、月和日的列,并在您的日期中分别添加日、月和年,然后使用以下内容:

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

    【讨论】:

      猜你喜欢
      • 2014-05-29
      • 1970-01-01
      • 1970-01-01
      • 2013-06-09
      • 1970-01-01
      • 2015-07-19
      • 1970-01-01
      • 2017-09-21
      • 2012-12-22
      相关资源
      最近更新 更多