将时间从字符转换为时间变量

时间:2014-07-01 19:44:05

标签: sql sql-server-2012

尝试查明错误在记录中的位置。 当我将视图A运行到4个记录,然后将该视图输入到另一个视图B时,我收到此错误。

  

从字符串转换日期和/或时间时转换失败。

时间是一个单独的字段而不是日期。 我不关心将时间字段添加到日期字段。 我希望从结束时间减去开始时间减去小时/分钟,并将结果显示为小时:分钟。

然而,当我使用基于id#的单独WHERE子句运行这4条记录中的每一条时,从View A中,我从未在视图B中收到错误消息。为什么会这样?我试图孤立糟糕的时间。

查看代码:

CASE WHEN LEFT(endtime,2) > 23 THEN CAST('23' + RIGHT(endtime, 3) AS TIME) WHEN endtime = '' THEN '23:59:00' ELSE CAST(endtime AS TIME) 
END AS Newendtime, 
CASE WHEN LEFT(starttime,2) > 23 THEN CAST('23' + RIGHT(starttime, 3) AS TIME) WHEN   starttime = '' THEN '23:59:00' ELSE CAST(starttime AS TIME) 
END AS NewStarttime, 

我有时间:

    start  end

    17:45 19:45
    20:55 15:39
    16:18 16:45
    0:10  11:15

看来0:10是罪魁祸首。但是当我只从视图A中输出那条记录时,它在视图B中运行正常。更奇怪的是当我添加另一个where子句来查看仍然输出相同记录的A时,我没有得到错误查看b。

视图B有一个WHERE子句

WHERE        (NewendTime <> NewstartTime)

当我取出它运行的WHERE子句时,保留它,我得到错误。

编辑:

我看到左边的语句正在查看冒号:。这是一个问题吗?

1 个答案:

答案 0 :(得分:0)

正如您所指出的那样,查看左侧2个字符将无效,因为冒号前面并不总是有两个字符。为什么不像现在这样投射田地呢?它们看起来都应该是有效的。我认为没有必要执行这些案例陈述。

SELECT 
    CAST([start] AS TIME) AS NewStartTime,
    CAST([end] AS TIME) AS NewStartTime
FROM 
    #times