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

问题描述:

我有一个数据库,其中CREATEDATECREATETIME作为varchars存储在2个独立的属性中。我试图将这2个合并为一个smalldatetime属性。将2 varchar属性转换为datetime时出错

当我运行下面的转换,我收到错误:

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,但是这只是暂时的办法,我可以用它来得到这个数据它更好)

我已经尝试了一些不同的事情,当整个集合工作,我似乎无法得到它的工作。

当在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程序转储的。

+0

你确定它不只是SMALLDATETIME不支持秒? (请参阅http://msdn.microsoft.com/en-gb/library/ms182418.aspx) – chrisb 2013-02-20 19:20:28

+2

@chrisb不,秒数被截断,它们不阻止转换。 – 2013-02-20 19:23:13

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, ':')); 

现在,既然你选择了存储日期/使用错误数据输入的实时数据,也不能保证所有的值你有实际上会进行适当的转换。

+0

+1给出答案*和*关于适当数据类型的警告。 – swasheck 2013-02-20 19:23:15

+0

这工作。我没有意识到'smalldatetime'截断了秒,谢谢。但是,无论如何,在这种情况下,我不在乎秒。 – mawburn 2013-02-20 19:35:18

SELECT RIGHT('000000' + CAST(createtime AS VARCHAR(6)), 6) paddedCreateTime 
FROM yourTable 

应使44427的样子044427,但我不知道这是你的问题是

+0

那么,请尝试'选择CONVERT(SMALLDATETIME,'044427');' - 这个答案不完整。 – 2013-02-20 19:25:42