我想知道如果数据在同一个表中但在两个单独的行上,如何获得时间差异。例如,下面我有一个数据截图,每个员工都有两个记录,第一个时钟点和最后一个时钟点。我希望这些时间之间的差异并将其保存到新表中。我怎么做?
表结构:
CREATE TABLE [dbo].[RefinedData](
[ClockNo] [nvarchar](50) NULL,
[FirstName] [nvarchar](50) NULL,
[LastName] [nvarchar](50) NULL,
[Department] [nvarchar](50) NULL,
[ClockPoint] [nvarchar](50) NULL,
[Date] [nvarchar](50) NULL,
[Time] [int] NULL
) ON [PRIMARY]
所以在这种情况下,我希望用户Gerard在新表中保存的时差,但每个用户只有一条记录。
从您的示例数据中可以明显看出,每个用户有2行数据。 row_number
将为您服务。减去rn2-rn1将返回所需的输出
with cte as
(select [ClockNo] ,
[FirstName] ,
[LastName] ,
[Department] ,
[ClockPoint] ,
[Date] ,
time,
ROW_NUMBER() over partition by clockno,firstname order by date,time) rn
from mytable
)
select c.[ClockNo] ,
c.[FirstName] ,
c.[LastName] ,
c.[Department] ,
c.[ClockPoint] ,
c.[Date] ,
c1.time -c.time
from cte c inner join (select * from cte where rn= 2) c1
on c.rn = c1.rn-1 and c.firstname = c.firstname and c.clockno = c1.cloclno
where c.rn = 1
您可以执行以下操作:
var differences =
refinedData.GroupBy(d => d.ClockNo)
.Select( g => g.OrderBy(d => d.Time))
.Select( g => new {
ClockNo = g.ClockNo,
Difference = g.Last() - g.First() });
试试这个-
select Firstname,cast(max(Time)-min(Time) as time) as 'time difference'
into #temptable
from RefinedData
where FirstName like 'Gerard'
and Date like '20180301'
group by Firstname
在这里你可以开始:
select *, datediff(hour, LAG([Datetime]) over (partition by FirstName, LastName order by [Datetime]), [Datetime]) [Difference_in_hours]
from (
select FirstName,
LastName,
ClockPoint,
--get correctly formatted date column
cast(stuff(STUFF([DATE], len([DATE]) - 3, 0, '-'), len([DATE]), 0, '-') + ' ' + stuff(STUFF([time], len([time]) - 3, 0, ':'), len([time]), 0, ':') as datetime) [Datetime]
from [RefinedData]
) a where
ClockPoint like '% out %' or
ClockPoint like '% in %' or
ClockPoint like '% out' or
ClockPoint like '% in' or
ClockPoint like 'out %' or
ClockPoint like 'in %'