这可能很长,我在前面道歉,我可以“罗嗦”试图解释自己。没有学会像我应该那样简洁。
我的问题是,由于我缺乏经验而且我认为这是一张布置不佳的桌子而让我感到沮丧。我需要从表中提取某些列并报告其中一个元素中嵌入的日期差异。 (见下面的样本)。
我无法重新组织表格,因为它是我公司在服务台上使用的应用程序的一部分,因此我对它的“组织”方式感到困惑。
表的结构基本上是这样的:所有列类型都是不同长度的varchar(),数据库是Windows Server 2003上的SQL Server 2005。
tickID | tickGen | tickAudit
----------------------------------
124567 | 1 | 2011-07-22 08:00:00 joeuser Open Ticket
124567 | 2 | 2011-07-22 08:00:00 joeuser Open Ticket Not Assigned
124567 | 3 | 2011-07-22 08:00:00 joeuser Open Ticket Priority Urgent
124567 | 4 | 2011-07-22 09:00:00 freduser Open Ticket Add Assignee
管理层希望知道tickAudit列中“时间戳”与“joeuser”使票证“未分配”以及“freduser”为票证添加受让人时的时间差。
在这个例子中,我提出了这些“有点工作”的查询,但我相信可能会更好:
declare @startTime datetime
declare @endTime datetime
declare @mrid varchar(6)
set @mrid = '124567'
select @startTime = cast(substring(tickAudit,1,19) as datetime)
from tickHistory where tickID = @tickID and tickAudit like '%Not Assigned'
select @endTime = cast(substring(tickAudit,1,19) as datetime)
from tickHistory where tickID = @tickID and tickAudit like '%Add Assignee'
select @mrid as 'ticket', @startTime as 'startTime',
@endTime as 'endTime', datediff(mi,@startTime,@endTime) as 'diff'
然而,查询无法处理“票证”具有多个条目的问题,在这个条目中,它已分配,然后未按照此示例分配:
tickID | tickGen | tickAudit
----------------------------------
124568 | 1 | 2011-07-22 08:00:00 joeuser Open Ticket
124568 | 2 | 2011-07-22 08:00:00 joeuser Open Ticket Not Assigned
124568 | 3 | 2011-07-22 08:00:00 joeuser Open Ticket Priority Urgent
124568 | 4 | 2011-07-22 09:00:00 freduser Open Ticket Add Assignee
124568 | 5 | 2011-07-22 11:00:00 freduser Open Ticket Not Assigned
124568 | 6 | 2011-07-22 12:00:00 bobuser Open Ticket Priority Low
124568 | 7 | 2011-07-22 12:00:00 bobuser Open Ticket Add Assignee
这里“freduser”已经编辑了票证,现在它再次被“分配”,两小时后“bobuser”编辑了它并分配了票证。所以我需要报告2个时间戳。我的查询只返回tickGen#5和tickGen#7的差异。它忽略了tickGen#2和tickGen#4的区别..或者我怀疑它只显示查询的最后一个有效匹配,无论返回多少。
这就是我被困的地方。希望有人可以给我一些建议或一个例子来说明上述例子中的情况。
答案 0 :(得分:1)
这是一种方法:
with th (tickID,tickGen,tickTime,tickType)
as
(select tickID,tickGen,
cast(substring(tickAudit,1,19) as datetime) as tickTime,
RIGHT(tickAudit,12)
from tickHistory
where RIGHT(tickAudit,12) in ('Not Assigned','Add Assignee'))
select t1.tickID,
t1.tickTime startTime,
t2.tickTime endTime,
DATEDIFF(mi,t1.tickTime,t2.tickTime) as diff
from th as t1
inner join th as t2
on t1.tickID = t2.tickID
and t1.tickGen < t2.tickGen
where t1.tickType = 'Not Assigned'
and t2.tickType = 'Add Assignee'
and t2.tickGen = (select MIN(tickGen) from th
where th.tickID = t1.tickID
and th.tickGen > t1.tickGen)