0

我有一个数据库,其中CREATEDATECREATETIME存储在 2 个单独的属性中作为 varchars。我试图将这两个组合成一个smalldatetime属性。

当我运行以下转换时,我收到错误:

The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.

UPDATE UsersTemp
SET Created =   CONVERT(datetime, CAST(CONVERT(date, CreateDateIMF, 102)AS varchar(50)) 
            + ' ' +
            CASE WHEN LEN(CreateTime) = 6 THEN 
                 Left(CreateTime, 2) + ':' + SUBSTRING(CreateTime, 2, 2)
            ELSE 
                 Left(CreateTime, 1) + ':' + SUBSTRING(CreateTime, 1, 2)
            END
            + ':' + Right(CreateTime, 2), 120)

(是的,这是凌乱的 SQL,但以我可以更好地使用它的方式获取这些数据只是暂时的)

在使用整套设备时,我尝试了许多不同的方法,但我似乎无法让它发挥作用。

在 a 中尝试上述参数时SELECT,日期工作正常,因此问题存在于时间字段中,但我不确定如何更正。

示例原始数据:

CREATEDATEIMF
 20120220
 20040415
 20040415
 20040415
 20040415
 20040415
 20040415
 20040415
 20040415
 20050510

CREATETIME
 160401
 142304
 142304
 142304
 142304
 142304
 142304
 142304
 142304
 44427

我已经确认时间是 HMMSS。(请注意,在短时间内没有前导 0)

此数据是来自旧 COBOL 程序的转储。

4

2 回答 2

5
DECLARE @x TABLE (CREATEDATE VARCHAR(32), CREATETIME VARCHAR(32));

INSERT @x VALUES
('20120101','142304'),
('20120101','44427');

SELECT CONVERT(DATETIME, 
  CREATEDATE + ' ' + STUFF(STUFF(RIGHT('00' 
  + CREATETIME, 6), 5, 0, ':'), 3, 0, ':'))
FROM @x;

所以在你的情况下,

UPDATE dbo.UsersTemp SET Created = CONVERT(DATETIME, 
  CREATEDATE + ' ' + STUFF(STUFF(RIGHT('000000' 
  + CREATETIME, 6), 5, 0, ':'), 3, 0, ':'));

现在,由于您选择使用错误的数据类型存储日期/时间数据,因此无法保证您拥有的所有值实际上都会正确转换。

于 2013-02-20T19:19:45.270 回答
1
SELECT RIGHT('000000' + CAST(createtime AS VARCHAR(6)), 6) paddedCreateTime
FROM yourTable

应该使 44427 看起来像 044427 但我不确定这是否是您的问题所在

于 2013-02-20T19:20:56.190 回答