【问题标题】:Split MySQL value into integers将 MySQL 值拆分为整数
【发布时间】:2018-09-02 01:27:41
【问题描述】:

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

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

这些结果都不能让我做我想做的事,即

SELECT LEFT(CONVERT(@datetimeStr, CHAR), 4) 期待 '2000',但它总是给我 2.00

我错过了什么?

【问题讨论】:

  • 您的属性显然在您的架构中定义为浮点数。您正在尝试像整数或 varchar 一样处理它。你能改变你的架构吗?
  • 仅供参考,代码缩进四个空格。
  • 我认为“csv 中的第一个值”必须是 200001011130,而不是 20000101130,这样您的问题的其余部分才有意义。对吗?
  • @O.琼斯,是的,我的错,200001011130 是 csv 中的第一个值
  • 哦,旧的 Excel 错误。我已经记不清我被它烧了多少次了。叹息。

标签: mysql types casting floating-point precision


【解决方案1】:

您已将时间戳的字符表示转换为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 的部分内容。

【讨论】:

  • 大学是否停止向人们教授浮点数?叹息。
  • 感谢您的建议。我不确定我的架构中的浮动是问题,实际上架构并没有在这里出现。 @datetimestr 是一个临时变量,用于存储 csv 中的值。在 LOAD DATA 命令的第二部分,我想将 200001011130 拆分为 3 个日期时间组件。
  • 在 csv 中,200001011130 就是这样存储的,没有引号,只是用逗号分隔。问题是临时变量 @datatimestr 显然将 200001011130 视为浮点数(而不是长整数或字符串,这对我有帮助)。感谢 STR_TO_DATE() 提示,我不知道这个函数或它的用途。我可以让 YEAR(STR_TO_DATE('200001010000', '%Y%m%d%H%i')) 工作,但不是 YEAR(STR_TO_DATE(@datetimeStr, '%Y%m%d%H%i') )
  • 是否有任何东西强制 LOAD DATA 命令将 csv 数字 200001010000 视为 BIGINT 或 CHAR(12)?
【解决方案2】:

好的,谜团解开了。

Excel 在欺骗我。当我将原始的大型 csv 缩减为可测试的文件时,它决定将 datetime 列存储为 2.00001E+11 (即 Excel 的默认“显示格式”)。当我对问题进行 H​​exEdited 时,我无意中查看了原始文件,其中包含 200001011130。

如此可靠的旧 MySQL 正在读取 2.00001E+11,因此难以区分日期和时间。

重新格式化该列后,Excel 将其正确保存,从此一切顺利。 (希望它可以帮助某人避免这个陷阱。)

再次感谢您的建议。 STR_TO_DATE() 函数很方便,可能比字符串操作更有效?!

感谢您对教授学生花车的关注!那是我的工作:-)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    • 2018-08-01
    • 1970-01-01
    • 2016-11-28
    • 1970-01-01
    • 2018-01-06
    • 1970-01-01
    相关资源
    最近更新 更多