我有一个日期的FLOAT
字段,如下所示:
+-----------+
| FloatDate |
+-----------+
| 1012013 | -- Jan 1
| 3262013 | -- Mar 26
| 11072013 | -- Nov 7
| 10012013 | -- Oct 1
+-----------+
并且我想将此数据插入到另一个表中,其dateField的数据类型为DATETIME
。
因此,我试图将FloatDate值转换为DATETIME,但一直失败。
我试过了
INSERT INTO NEWTABLE
(DateTimeDate)
SELECT CONVERT(DATETIME, CAST(CAST(FloatDate AS INTEGER) AS CHAR), 112)
FROM OLDTABLE
但这给了我一个错误
从字符串转换日期时间时转换失败
如果FloatDate的日期格式是YYYYMMDD,它似乎可以工作。所以,如果我这样做,它就可以工作。
DECLARE @test FLOAT
SET @test = 2132013
SELECT @test, CONVERT(DATETIME, CAST(RIGHT(CAST(@test AS INTEGER), 4) AS CHAR(4)) +
CASE WHEN LEN(CAST(@test AS INTEGER)) = 7 THEN '0' + CAST(LEFT(CAST(@test AS INTEGER), 3) AS CHAR(3))
WHEN LEN(CAST(@test AS INTEGER)) = 8 THEN CAST(LEFT(CAST(@test AS INTEGER), 4) AS CHAR(4)) END, 1)
但是,我想知道我是不是把这个弄得太复杂了,而只是错过了更简单的解决方案,或者这是我唯一能实现的方法?
5条答案
按热度按时间zu0ti5jz1#
假设您有其他值,例如:
然后,您可以执行以下操作:
结果:
在您的示例中,它将是:
当然,您可能会有一些错误的数据在那里,即使你得到了语法正确的 * valid* 值。因为你使用
FLOAT
,你没有得到任何固有的验证,所以该列可能包含-999
或45671213
等。你觉得这很痛苦吗?很好!它 * 应该 * 很痛苦。你应该回去找那些决定在
FLOAT
列中存储日期的人,踢他们的胫骨。问问他们是否使用地理数据类型存储工资。我很高兴你解决了这个问题,但是不应该允许这些人参与数据库设计。最后,请不要这样做:
请始终指定长度。原因如下:
lvjbypge2#
如果你有一个八位数的数字(浮点数),你可以这样做
o0lyfsai3#
第二种方法更清洁,
3htmauhk4#
为了能够将浮点日期转换为日期时间格式,您需要将浮点数据转换为Varchar格式。这就是@yogesh-sharma answer可以工作的原因。
hwamh0ep5#
如果您的字段是FLOAT64,而您想要将它转换为TIMESTAMP,您可以执行下列动作:
然后,如果你想让你的字段在DATETIME中,则只需转换:
或