我尝试将(较大的)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/