将2 varchar属性转换为datetime时出错
我有一个数据库,其中CREATEDATE
和CREATETIME
作为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程序转储的。
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, ':'));
现在,既然你选择了存储日期/使用错误数据输入的实时数据,也不能保证所有的值你有实际上会进行适当的转换。
SELECT RIGHT('000000' + CAST(createtime AS VARCHAR(6)), 6) paddedCreateTime
FROM yourTable
应使44427的样子044427,但我不知道这是你的问题是
那么,请尝试'选择CONVERT(SMALLDATETIME,'044427');' - 这个答案不完整。 – 2013-02-20 19:25:42
你确定它不只是SMALLDATETIME不支持秒? (请参阅http://msdn.microsoft.com/en-gb/library/ms182418.aspx) – chrisb 2013-02-20 19:20:28
@chrisb不,秒数被截断,它们不阻止转换。 – 2013-02-20 19:23:13