我目前正在将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)以正确的格式存储该时间?
答案 0 :(得分:0)
与小时格式说明符“%H”和“%k”接受大于0-23的值不同,没有分钟格式说明符接受大于0-59的值。
您可以使用MYSQL提供的字符串函数将DURATION字段转换为正确的格式(如140:28 - > 2:20:28)。
但是更好的做法是使用其他工具/语言/脚本,这比字符串操作中的MYSQL字符串函数更有效,更容易进行字符串转换。
答案 1 :(得分:0)
我设法通过字符串操作来解决这个问题。它不是最优雅的解决方案,但嘿!它有效!
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;