CAST将VARCHAR更正为DateTime

时间:2014-08-04 09:26:10

标签: sql sql-server date datetime

美好的一天

我正在使用现有的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'`

现在日期看起来是正确的格式但是当我想要合并日期和时间时,我会发现VARCHARDateTime错误。

我该如何解决这个问题?

这是错误:

  

将varchar数据类型转换为日期时间数据类型会导致超出范围的值(仅限RAN 804记录)

由于

3 个答案:

答案 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))

因为时间栏的长度并不重要