我尝试将(biggish)csv加载到表中。我用:
LOAD DATA LOCAL INFILE
'C:\\ProgramData\\MySQL\\MySQL Server 5.7\\Uploads\\xxxx.csv'
INTO TABLE xxx
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES
(@datetimeStr,...
csv中的第一个值是' 20000101130'。 MySQL读取@datetimeStr为2.00001E + 11(即数字?!)
我需要将此号码拆分为: 年日时(每个4个字符):即2000 0101 1130
我试过了:
SELECT @datetimeStr; - >给我' 2.00001E + 11' (即一个数字)
SELECT转换(@datetimeStr,CHAR); - >给我' 2.00001E + 11' (也就是数字)???
SELECT cast(@datetimeStr AS CHAR); >给我' 2.00001E + 11' (也就是数字)???
这些结果都不能让我做我想做的事,即
SELECT LEFT(CONVERT(@ datetimeStr,CHAR),4)期待' 2000',但它总是给我2.00
我错过了什么?
答案 0 :(得分:0)
您已将时间戳的字符表示转换为FLOAT
个数字。这意味着您已经失去了提取月中某天所需的精度,以及小时和分钟。那精度已经消失了。您需要重新加载数据。 FLOAT
使用single-precision IEEE-754 floating point representation。它只能管理超过七位小数的精度,因此您从2000010???
获得200001011130
。
如果您已将该精度转换为DOUBLE
而不是FLOAT
,那么您尝试的各种技巧可能会有效。 DOUBLE
使用double-precision representation。它只处理15个十进制数字的精度,因此您的数字几乎不适合。
你可能会考虑这个事实和use STR_TO_DATE()
。这个表达
STR_TO_DATE('200001011130', '%Y%m%d%H%i')
生成一个DATETIME
值,表示文本字符串中的时间。然后你可以说像
YEAR(STR_TO_DATE('200001011130', '%Y%m%d%H%i'))
和
TIME(STR_TO_DATE('200001011130', '%Y%m%d%H%i'))
检索DATETIME
的部分内容。
答案 1 :(得分:0)
好的,神秘解决了。
Excel正在欺骗我。当我将原始的大型csv缩减为可测试文件时,它决定将datetime列存储为2.00001E + 11(即Excel的默认“显示格式”)。当我在HexEdited问题时,我无意中看了原始文件,里面有200001011130.如此值得信赖的旧MySQL正在阅读2.00001E + 11,因此难以分开日期和时间。
重新格式化列后,Excel正确保存了它,并且从那里开始一切顺利。 (希望它可以帮助某人避免这个陷阱。)
再次感谢您的建议。 STR_TO_DATE()函数是否方便,可能比字符串操作更有效?!
感谢您关于向学生讲授花车的担忧!这是我的工作: - )