将2 varchar属性转换为datetime时出错

maw*_*urn 0 sql t-sql sql-server sql-server-2008

我有一个数据库,其中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)
Run Code Online (Sandbox Code Playgroud)

(是的,这是凌乱的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
Run Code Online (Sandbox Code Playgroud)

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

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

Aar*_*and 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;
Run Code Online (Sandbox Code Playgroud)

所以在你的情况下,

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

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