我正在编写一个复杂的查询,但我在计算案例 表达式 时遇到了一些问题(谢谢 )。基本上,由于在这个网站上的一些很好的帮助,我设法通过使用有序表解决了另一个问题,但现在我之前使用的一个选择语句不再用于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格式而不是日期时间,我一直试图解决这个问题。
答案 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<> “错误文字”,我解决了这个问题。