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

我想念什么?

最佳答案

您已将时间戳记的字符表示形式转换为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

10-06 13:17