TSQL如何从另一个列中获取日期,然后获取下一个日期?

时间:2020-09-15 17:06:31

标签: sql tsql join

我有一个查询,试图将我需要选择一个日期的地方,然后从另一个列中选择下一个发生日期。

我的选择语句是:

Select tblOEEDownTime.LineNumber, 
tblOEEDownTime.SampleDate as 'Down Time',
tblOEEUpTime.Sampledate as 'Up Time', 
(DATEDIFF(minute, tblOEEDownTime.SampleDate, tblOEEUpTime.Sampledate )) as 'Minutes Down', 
tblOEEUpTime.Reason, 
tblOEEUpTime.Comment as DownTime 

from tblOEEDownTime JOIN 
tblOEEUpTime on tblOEEDownTime.LineNumber = tblOEEUpTime.LineNumber

where TblOEEDownTime.SampleDate > '2020-09-14' and TblOEEDownTime.LineNumber like '6427' and tblOEEUpTime.SampleDate > tblOEEDownTime.SampleDate
Group by tblOEEDownTime.LineNumber, tblOEEDownTime.SampleDate, tblOEEUpTime.SampleDate, tblOEEUpTime.Reason, TblOEEUptime.Comment

Picture of results

在结果图中,我希望返回的值是突出显示的行。我或多或少希望将停机时间与相关的停机时间之后的下一个正常运行时间联系起来。

1 个答案:

答案 0 :(得分:0)

您可以使用cross apply为每个停机时间行提取下一个正常运行时间行。

样本数据

create table tblOEEDownTime
(
  LineNumber int,
  SampleDate datetime
);

insert into tblOEEDownTime (LineNumber, SampleDate) values
(6427, '2020-09-16 10:00:00'),
(6427, '2020-09-16 12:00:00'),
(6427, '2020-09-16 15:00:00');

select * from tblOEEDownTime;

create table tblOEEUpTime
(
  LineNumber int,
  SampleDate datetime,
  Reason nvarchar(20),
  Comment nvarchar(20)
);

insert into tblOEEUpTime (LineNumber, SampleDate, Reason, Comment) values
(6427, '2020-09-16 10:01:00', 'Replenish', null),
(6427, '2020-09-16 10:03:00', 'Testing', 'Drew'),
(6427, '2020-09-16 10:05:00', 'Cleaning', null),
(6427, '2020-09-16 12:05:00', 'Replenish', null),
(6427, '2020-09-16 12:08:00', 'Testing', 'Drew'),
(6427, '2020-09-16 12:10:00', 'Cleaning', null),
(6427, '2020-09-16 15:30:00', 'Cleaning', null);

解决方案

select d.LineNumber,
       d.SampleDate as [Down Time],
       u.Sampledate as [Up Time],
       datediff(MI, d.SampleDate, u.Sampledate) as [Minutes Down],
       u.Reason,
       u.Comment as DownTime 
from tblOEEDownTime d
cross apply ( select top 1 u1.SampleDate, u1.Reason, u1.Comment
              from tblOEEUpTime u1
              where u1.LineNumber = d.LineNumber
                and u1.SampleDate > d.SampleDate
              order by u1.SampleDate ) u
where d.SampleDate > '2020-09-14'
  and d.LineNumber = 6427;

结果

LineNumber  Down Time               Up Time                 Minutes Down    Reason      DownTime
----------- ----------------------- ----------------------- --------------- ----------- --------
6427        2020-09-16 10:00:00.000 2020-09-16 10:01:00.000 1               Replenish   null
6427        2020-09-16 12:00:00.000 2020-09-16 12:05:00.000 5               Replenish   null
6427        2020-09-16 15:00:00.000 2020-09-16 15:30:00.000 30              Cleaning    null

交互式版本:fiddle