从案例表达式

时间:2017-01-11 15:01:46

标签: sql sql-server-2008 date casting

我正在编写一个复杂的查询,但我在计算案例 表达式 时遇到了一些问题(谢谢 )。基本上,由于在这个网站上的一些很好的帮助,我设法通过使用有序表解决了另一个问题,但现在我之前使用的一个选择语句不再用于OT。

我收到错误:

  

从字符串

转换日期和/或时间时转换失败

问题的核心是我想计算从结束日期减去开始日期的持续时间。我之前使用的代码是

select
    cast((CASE 
             WHEN ap.startLIKE '%[^0-9]%' 
                THEN CAST(ap.end as datetime) 
                ELSE NULL 
          END)
          -
          (CASE 
              WHEN ap.start LIKE '%[^0-9]%' 
                 THEN CAST(ap.start as datetime) 
                 ELSE NULL 
           END) as time) as Duration, 
    ap.start, ap.end, ap.description
from 
    Table as AP
group by 
    ap.start, ap.end, ap.description

但当我改变从有序表中绘制此信息时:

Select 
    ot.starttime as "Start Time", 
    ot.endtime as "End Time", 
    ot.description "Description", 
    ot.entrynumber as "ID Number",
    cast((CASE 
             WHEN ot.endtime LIKE '%[^0-9]%' 
                THEN CAST(ot.endtime as datetime) 
             ELSE NULL 
          END)
          -
          (CASE 
              WHEN ot.starttime LIKE '%[^0-9]%' 
                 THEN CAST(ot.starttime as datetime) 
              ELSE NULL 
           END) as time) as duration
From
    OrderedTable as OT
group by
    ot.starttime, ot.endtime, ot.description, ot.entrynumber
order by 
    ot.endtime

我收到错误。以前应用group by子句已删除了错误,但未从有序表中删除。

由于我一直在努力消除转换到日期问题,因此我真的不确定导致问题的原因,我将不胜感激。

原始问题是服务器上的日期字段是nvarchar格式而不是日期时间,我一直试图解决这个问题。

2 个答案:

答案 0 :(得分:0)

如果我理解你的问题 - 你可以使用

TIMEDIFF(date1, date2)TIMESTAMPDIFF(SECOND, date2, date1);

其中date2< date1查找两个日期之间的时间。在第一种情况下,您将得到HH:mm:ss格式的结果,在第二种情况下,它将以秒为单位 - 取决于您的需要。由于您没有发布示例日期在您的专栏中的显示方式,我无法确定,但我认为您不需要转换 - 您可以将日期作为字符减去(如果它们看起来像这样#39 ; 2016-12-31 11:02:00')

答案 1 :(得分:0)

由于列的格式为nvarchar32而不是日期/时间,因此导致数据库定期接收完成时间(某些)打开记录的文本值而不是NULL值。 这只是定期发生的,无论出于何种原因设计数据库。

理想情况下,这不应该发生,因为它针对数据库约定来执行此类操作,因为计算函数会忽略NULL值,因为它们是未知的。仍然不清楚为什么案例表达没有解决问题,但使用过滤器FinishTime<> “错误文字”,我解决了这个问题。