将MySQL值拆分为整数

时间:2018-03-23 11:18:24

标签: mysql types casting floating-point precision

我尝试将(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

我错过了什么?

2 个答案:

答案 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()函数是否方便,可能比字符串操作更有效?!

感谢您关于向学生讲授花车的担忧!这是我的工作: - )