美好的一天
我正在使用现有的SQL Server数据库。开发人员所做的是将日期和时间分开。日期是DateTime格式(我想要的),但时间不正确。如果它是14:30它显示为1430时它的09:25显示为925.我正在尝试将日期和时间结合起来为我正在该数据库上编写的程序设置日期时间视图。
我已将日期创建为正常日期,如下所示:
CASE
WHEN LEN(T0.BeginTime) = 3 THEN '0' + LEFT(T0.BeginTime, 1) + ':' + RIGHT(T0.BeginTime, 2)
ELSE LEFT(T0.BeginTime, 2) + ':' + RIGHT(T0.BeginTime, 2)
END AS 'NEW Start Time'`
现在日期看起来是正确的格式但是当我想要合并日期和时间时,我会发现VARCHAR
到DateTime
错误。
我该如何解决这个问题?
这是错误:
将varchar数据类型转换为日期时间数据类型会导致超出范围的值(仅限RAN 804记录)
由于
答案 0 :(得分:1)
这应该可以解决问题,希望它有所帮助。
DECLARE @DateTime TABLE (
DateWithTime DATE,
BeginTime INT);
INSERT INTO @DateTime
VALUES ('2014-08-04', '1525'),
('2014-08-04', '525'),
('2014-08-04', '15'),
('2014-08-04', '5'),
('2014-08-04', '0'),
('2014-08-04', '90')
;WITH cte_BeginTimeFix
AS (
SELECT
CONVERT(VARCHAR(10), DateWithTime, 120) AS DateWithTime,
RIGHT('0000' + CAST(BeginTime AS VARCHAR(4)), 4) AS BeginTime
FROM @DateTime
)
, cte_DateString
AS (
SELECT DateWithTime,
BeginTime,
DateWithTime + ' ' + STUFF(STUFF('00:00:00.000', 4, 2, RIGHT(BeginTime, 2)), 1, 2, LEFT(BeginTime, 2)) AS DateTimeStr
FROM cte_BeginTimeFix
)
SELECT DateWithTime,
BeginTime,
CASE
WHEN ISDATE(DateTimeStr) = 1 THEN CAST(DateTimeStr AS DATETIME)
ELSE NULL
END AS DateTimeStr
FROM cte_DateString
答案 1 :(得分:0)
这应该有效:
CONVERT
(
DATETIME,
CONVERT(VARCHAR,T0.Date,112) +
' ' +
CASE
WHEN ISNULL(T0.BeginTime,'0') = '0'
THEN '00:00'
ELSE
RIGHT
(
'00' + LEFT(T0.BeginTime,LEN(T0.BeginTime) - 3),
2
) +
':' +
RIGHT(T0.BeginTime,2)
END
)
答案 2 :(得分:0)
另一种方法是以分钟为单位转换时间列并将其添加到日期
DATEADD(minute, T0.BeginTime / 100 * 60 + T0.BeginTime % 100
, CONVERT(VARCHAR, T0.BeginDate, 112))
因为时间栏的长度并不重要