2

我有一个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)

但是,我想知道我是否让这太复杂而只是错过了更简单的解决方案,或者这是我能实现的唯一方法?

4

4 回答 4

7

假设您有其他值,例如:

 3092013 -- March 9th
10052013 -- October 5th
 1112013 -- January 11th
11012013 -- November 1st

然后你可以这样做:

DECLARE @x TABLE(FloatDate FLOAT);

INSERT @x VALUES
( 3092013),-- -- March 9th
(10052013),-- -- October 5th
( 1112013),-- -- January 11th
(11012013);-- -- November 1st

;WITH s(d) AS (SELECT RIGHT('0' + CONVERT(VARCHAR(32), 
  CONVERT(INT, FloatDate)), 8) FROM @x),
d(d) AS (SELECT CONVERT(DATETIME, 
  RIGHT(d,4) + LEFT(d,2) + SUBSTRING(d,3,2)) FROM s)
SELECT d FROM d;

结果:

d
-----------------------
2013-03-09 00:00:00.000
2013-10-05 00:00:00.000
2013-01-11 00:00:00.000
2013-11-01 00:00:00.000

在您的示例中,它将是:

;WITH s(d) AS (SELECT RIGHT('0' + CONVERT(VARCHAR(32), 
  CONVERT(INT, FloatDate)), 8) FROM dbo.OLDTABLE),
d(d) AS (SELECT CONVERT(DATETIME, 
  RIGHT(d,4) + LEFT(d,2) + SUBSTRING(d,3,2)) FROM s)
INSERT dbo.NEWTABLE
SELECT d FROM d;

当然,即使您获得了正确的有效值语法,您也可能在其中有一些错误的数据。由于您使用过FLOAT,您没有得到任何固有的验证,因此该列可能包含-99945671213等。

你觉得这很痛苦吗?好的!应该很痛苦。您应该回到决定将日期存储在FLOAT列中并将它们踢到胫骨上的人。询问他们是否使用地理数据类型存储工资。我很高兴您正在解决此问题,但不应允许这些人靠近数据库设计。

最后,请不要这样做:

CAST(anything AS CHAR)

始终指定长度。原因如下:

于 2013-03-28T00:38:09.307 回答
4

如果你有一个八位数字(浮点数),你可以这样做

select cast(cast(cast([invoice date] as int) as varchar(8)) as datetime)
于 2014-03-12T01:39:19.743 回答
2
print (convert(float, CAST('1900-01-01 03:30' AS DATETIME)))--days 0,145833333333333
print (convert(float, CAST('1900-01-01 03:30' AS DATETIME))*24)--hours 3,5
print (convert(float, CAST('1900-01-01 03:30' AS DATETIME))*24*60)--minutes 210
print (convert(float, CAST('1900-01-01 03:30' AS DATETIME))*24*60*60)--seconds 12600

第二种方法更干净

print (CAST(CAST('1900-01-01 03:30' AS DATETIME) AS FLOAT))--days 0,145833333333333
print (CAST(CAST('1900-01-01 03:30' AS DATETIME) AS FLOAT)*24)--hours 3,5
print (CAST(CAST('1900-01-01 03:30' AS DATETIME) AS FLOAT)*24*60)--minutes 210
print (CAST(CAST('1900-01-01 03:30' AS DATETIME) AS FLOAT)*24*60*60)--seconds 12600
于 2015-12-02T14:12:47.413 回答
1

为了能够将浮点日期转换为日期时间格式,您需要将浮点数据转换为 Varchar。这就是@yogesh-sharma 回答有效的原因。

于 2018-02-22T18:14:35.313 回答