一尘不染

在SQL中的同一表中找到两个连续行之间的时间差

sql

我被卡住了。我一直在寻找答案,但似乎找不到从合适的同一张表的两行中减去同一张表中的时间。我在下面的查询中遇到困难。在下表中,我想将TimeOut从一行到下一行的TimeIn进行区分。考虑在下表中查找第1行中的TimeOut(10:35am)与第2行中的TimeIn(10:38 am)之间的分钟差。

表格1: TIMESHEET

ROW    EmpID       TimeIn                   TimeOut
----------------------------------------------------------------
1       138         2014-01-05 10:04:00      2014-01-05 10:35:00   
2       138         2014-01-05 10:38:00      2014-01-05 10:59:00 
3       138         2014-01-05 11:05:00      2014-01-05 11:30:00

预期成绩

ROW    EmpID       TimeIn                   TimeOut                  Minutes
----------------------------------------------------------------------------
1       138         2014-01-05 10:04:00      2014-01-05 10:35:00       
2       138         2014-01-05 10:38:00      2014-01-05 10:59:00       3
3       138         2014-01-05 11:05:00      2014-01-05 11:30:00       6
etc
etc
etc

基本上,我需要区分查询中的时间以显示员工休息的时间。

我曾尝试进行联接,但这似乎行不通,而且我不知道OVERwithPARTITION是不可行的方法,因为我似乎无法遵循逻辑(是的,我仍在学习)。我还考虑了两个临时表并对其进行比较,但是当我开始更改工作日或员工ID时,这是行不通的。最后,我想也许LEAD在一个OVER声明?还是DATEDIFF用a做简单CAST吗?


阅读 199

收藏
2021-03-17

共1个答案

一尘不染

我已经为类似的问题解决了这个问题,它不必对行进行排序:

select t1.EmpID, t1.TimeIn, t1.TimeOut, 
       datediff(minute, max(t2.TimeOut), t1.TimeIn) as minutes
from timesheet t1 left join timesheet t2 on t1.EmpID = t2.EmpID 
       and t2.TimeOut < t1.TimeIn
group by t1.EmpID, t1.TimeIn, t1.TimeOut

让我知道这个是否奏效。

这是一个SQL提琴:http
://sqlfiddle.com/#!3/89a43/1

2021-03-17