【问题标题】:More than 60 seconds or minutes in MySQL import fileMySQL 导入文件超过 60 秒或分钟
【发布时间】:2015-06-19 05:13:15
【问题描述】:

我目前正在将 CSV 文件导入 MySQL 表,其中包含如下行:

2/28/2015 8:46:30 PM,1:40,2,1234567,1435.6071
2/28/2015 8:45:58 PM,0:19,1,1234568,1435.6436

它基本上是来自 PBX 的 CDR。但是,我无法控制信息源,所以我只是按原样接收此文件。到目前为止,列是:

DATE,DURATION,MINUTES,PHONE,BALANCE

我使用 LOAD DATA INFILE 来导入我的数据,如下所示:

LOAD DATA INFILE '10811.csv'
INTO TABLE cdr
fields terminated by ','
lines terminated by '\n'
(@col1, @col2, MINUTES, PHONE, BALANCE)
set DATE = STR_TO_DATE(@col1,'%m/%d/%Y %h:%i:%s %p'),
DURATION = STR_TO_DATE(@col2,'%i:%s'),
CARDID = 10811;

CARDID 只是一个存储我的源文件名的字段

问题是:DURATION 给我带来了问题。请参阅:有些行是这样的:

2/28/2015 8:46:30 PM,140:28,141,1234569,1435.6071

也就是说,持续时间是 140 分 28 秒;但是,如果我存储该值,它会给我一个错误。这是因为:

> SELECT str_to_date('140:28','%i:%s') AS DATE;
+------+
| DATE |
+------+
| NULL |
+------+

因为 %i 预计分钟数介于 00 和 59 之间。

我尝试使用 SEC_TO_TIME,但也失败了(它只需要第一个数字):

> SELECT sec_to_time('140:28') AS DATE;
+----------+
| DATE     |
+----------+
| 00:02:20 |
+----------+

如何修改我的查询(请仅使用 SQL)以正确格式存储该时间?

【问题讨论】:

  • 将字段设为 int 并存储您可以使用的秒数,即120,240 等。您可以将此数字快速转换为分钟和小时。

标签: mysql load-data-infile str-to-date


【解决方案1】:

与小时格式说明符“%H”和“%k”接受大于范围 0-23 的值不同,分钟格式说明符不接受大于范围 0-59 的值。

您可以使用 MYSQL 提供的字符串函数将 DURATION 字段转换为适当的格式(如 140:28 -> 2:20:28)。

但更好的做法是使用其他工具/语言/脚本,在字符串操作方面比 MYSQL 的字符串函数更高效、更容易进行字符串转换。

【讨论】:

    【解决方案2】:

    我已经设法通过字符串操作解决了这个问题。这不是最优雅的解决方案,但是,嘿!它有效!

    LOAD DATA INFILE '10811.csv'
    INTO TABLE cdr
    fields terminated by ','
    lines terminated by '\n'
    (@col1, @col2, MINUTES, PHONE, BALANCE)
    set DATE = STR_TO_DATE(@col1,'%m/%d/%Y %h:%i:%s %p'),
    DURATION = SEC_TO_TIME(SUBSTRING_INDEX(@col2,':',1)*60+SUBSTRING_INDEX(@col2,':',-1))
    CARDID = 10811;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多