mysql - 将 MySQL 值拆分为整数

标签 mysql types casting floating-point precision

我尝试将(较大的)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 conversion(@datetimeStr , CHAR); -> 给我“2.00001E+11”(即也是一个数字)???

SELECT cast(@datetimeStr AS CHAR);> 给我“2.00001E+11”(即也是一个数字)???

这些结果都不允许我做我想做的事,即

SELECT LEFT(CONVERT(@datetimeStr, CHAR), 4) 预期为“2000”,但它总是给我 2.00

我错过了什么?

最佳答案

您已将时间戳的字符表示形式转换为 FLOAT 数字。这意味着您失去了提取月份、小时和分钟所需的精度。那种精确度已经消失了。您需要重新加载数据。 FLOAT 使用 single-precision IEEE-754 floating point representation 。它只能管理略多于七位小数的精度,因此您可以从 200001011130 得到 2000010???

如果您已将该精度转换为 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的部分内容。

关于mysql - 将 MySQL 值拆分为整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49448481/

相关文章:

java - 奇怪的类强制转换异常

java - 为什么将 Type[] 转换为 Class[] 会抛出 ClassCastException?

android - 字符串不能转换为整数

php - WordPress 有时很慢,有时又很快

c++ - 数据类型 - 排序和代码大小

C 宏使用文字与变量产生不同的结果

objective-c - 在 uint8_t * 和 char * 之间转换。会发生什么?

mysql - MySQL 程序中的参数类型?

mysql - host localhost 不允许连接到这个 MySQL 服务器

php - 将实时站点移至本地 - 问题识别数据库