EquipmentUseId CollectionPointId EmployeeNum ShopOrder StartDateTime
366 69 9999 999999 4/26/13 3:29 PM
373 69 4878 107321 4/26/13 10:19 PM
385 69 4971 107321 4/27/13 7:35 AM
393 69 4179 107325 4/30/13 7:24 AM
394 69 4179 107325 4/30/13 7:38 AM
395 69 4179 107325 4/30/13 10:28 AM
398 69 4179 107325 4/30/13 2:41 PM
399 69 9999 999999 4/30/13 2:43 PM
400 69 9999 999999 4/30/13 2:46 PM
鉴于上表,我留下了一个独特的问题并描述它可能同样困难。每个员工的每个ShopOrder都有一个StartDateTime,但没有StopDateTime,这是设计的。但是我需要能够计算一个ShopOrder的StartDateTime和下一个ShopOrder的StartDateTime之间的时间差。例如:SO#999999于4月26日15:29由员工9999开始,然后新员工#107321于4月26日22:19由员工4878启动。我需要计算4 /之间的差异26/2013 22:19和4/26/2013 15:29。这将给我SO#9999的时钟输出日期,但它实际上需要一个辅助过程。现在我只需要能够得到时间。一个问题是,如果SO#是相同的,那么我只会使用第一个StartDateTime,以及下一个SO#的第一个StartDateTime。对不起,这太久了,我甚至不确定此时我是否已解释过任何问题。
请放轻松我...这是漫长的一天。
在2013年8月19日编辑输出:
在周末考虑之后,我认为这是最好的 使用EndDateTime作为此查询只是第一步 整体申请/报告。
此外,EmployeeNum不再与该部分申请相关。
这应该是它的样子(EquipmentUseID是PK,the CollectionPointID总是69,所以它们不需要显示在 输出)?
ShopOrder StartDateTime EndDateTime 999999 4/26/13 3:29 PM 4/26/13 10:19 PM 107321 4/26/13 10:19 PM 4/30/13 7:24 AM 107325 4/30/13 7:24 AM 4/30/13 2:43 PM 999999 4/30/13 2:43 PM <next SO# StartDateTime>
总结一下这个表格,我需要 SO#,每个SO#的StartDateTime (已经在表格中), 以及 EndDateTime ,它实际上是下一个SO#的StartDateTime。希望这清除 它,抱歉混淆。
答案 0 :(得分:0)
这是第一个问题的解决方案,即在“下一个”车间订单上获取下一个日期时间。此解决方案使用相关子查询:
select t.*, nextStartDateTime - StartDateTime -- or use datediff() here if you want the time in particular units
from (select t.*,
(select top 1 StartDateTime
from t t2
where t2.StartDateTime > t.StartDateTime and
t2.ShopOrder <> t.ShopOrder
order by StartDateTime
) as nextStartDateTime
from t
) t;
第二个问题是获得给定车间订单的第一条记录。我不确定我完全明白这一点。如果您编辑问题以解释问题中提供的数据所需的结果,将会有所帮助。
答案 1 :(得分:0)
with orderedTickets as
(
select ShopOrder, min(StartDateTime) as date
, row_number() over (order by min(StartDateTime)) as rownumber
from table
where ShopOrder is not null
group by ShopOrder
)
select t1.ShopOrder, datediff(ss, t1.StartDateTime, t2.StartDateTime)
from orderedTickets as t1
join orderedTickets as t2
on t2.rownumber = t1.rownumber + 1
答案 2 :(得分:0)
使用CTE, -
;with Equipment as
(
select EquipmentUseId, CollectionPointId, EmployeeNum, ShopOrder, StartDateTime, row_number() over (PARTITION BY ShopOrder order by EquipmentUseId) as rownumber
from your_table
),
Equipment2 AS (
select EquipmentUseId, CollectionPointId, EmployeeNum, ShopOrder, StartDateTime, row_number() over (order by EquipmentUseId) as rownumber
from Equipment WHERE rownumber = 1
)
SELECT t1.EquipmentUseId,
t1.CollectionPointId,
t1.EmployeeNum,
t1.ShopOrder,
t1.StartDateTime,
CONVERT(VARCHAR, DATEDIFF(n, t1.StartDateTime, t2.StartDateTime) / 60) + ':' + RIGHT('0' + CONVERT(VARCHAR,(DATEDIFF(n, t1.StartDateTime, t2.StartDateTime)%60)), 2) time_diff
FROM Equipment2 AS t1
LEFT JOIN Equipment2 AS t2 ON t2.rownumber = t1.rownumber + 1