maw*_*urn 0 sql t-sql sql-server sql-server-2008
我有一个数据库,其中CREATEDATE
和CREATETIME
存储在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程序的转储.
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)
现在,由于您选择使用错误的数据类型存储日期/时间数据,因此无法保证您所拥有的所有值实际上都会进行适当的转换.