Sql server 检查第一行日期是否介于下一行日期之间
每行有一个Sql server 检查第一行日期是否介于下一行日期之间,sql-server,date,sql-server-2014,Sql Server,Date,Sql Server 2014,每行有一个DateEff和一个DateExp。假设我返回5行。我需要检查第一行的DateEff,看看它是否在第二、第三、第四和第五行的DateEff和DateExp之间,依此类推。我需要检查每个DateEff以确保它不在任何行DateEff和DateExp之间 下面是数据的示例。如您所见,第3行DateEff是(2013-03-30),它位于第4行DateEff和DateExp和第5行DateEff和`DateExp>之间 桌子 结果是这样的 Prob Id Problem Date
DateEff
和一个DateExp
。假设我返回5行。我需要检查第一行的DateEff
,看看它是否在第二、第三、第四和第五行的DateEff
和DateExp
之间,依此类推。我需要检查每个DateEff
以确保它不在任何行DateEff
和DateExp
之间
下面是数据的示例。如您所见,第3行DateEff
是(2013-03-30),它位于第4行DateEff
和DateExp
和第5行DateEff
和`DateExp>之间
桌子
结果是这样的
Prob Id Problem Date Affected Id Aff Date Range
3 2013-03-30 4 2013-01-01 - 2015-02-10
3 2013-03-30 5 2013-01-01 - 2999-01-01
将表连接到自身以返回重叠的行对:
Select a.RowID, a.DateEff as ProblemDate
, b.RowID as OverlapID, b.DateEff as OverlapStart, b.DateExp as OverlapEnd
from MyTable a
left join MyTable b
on a.RowID <> b.RowID
and a.DateEff <= b.DateExp
and a.DateEff >= b.DateEff
选择a.RowID、a.DateEff作为ProblemDate
,b.RowID作为OverlapID,b.DateEff作为OverlapStart,b.DateExp作为OverlapEnd
从我的表a
左连接MyTable b
关于a.RowID b.RowID
a.DateEff=b.DateEff
我认为这应该适合您:
select
[Prob Id] = t.rowid,
[Problem Date] = t.DateEff,
[Affected Id] = a.rowid,
[Aff Date Range] = concat(a.DateEff,' - ',a.DateExp)
from tbl t -- your table is called tbl
outer apply
(
select *
from tbl -- your table is called tbl
where t.DateEff between dateeff and DateExp and rowid > t.rowid
) a
where a.DateEff is not null
order by t.rowid, t.DateEff;
根据您的样本数据,结果如下:
Prob Id Problem Date Affected Id Aff Date Range
3 2013-03-30 4 2013-01-01 - 2015-02-10
3 2013-03-30 5 2013-01-01 - 2999-01-01
4 2013-01-01 5 2013-01-01 - 2999-01-01
要从示例(不包括第4行)中获得准确的输出,请更改应用到t.DateEff>DateEff和t.DateEfft.rowid
中的条件。然后,输出将是:
Prob Id Problem Date Affected Id Aff Date Range
3 2013-03-30 4 2013-01-01 - 2015-02-10
3 2013-03-30 5 2013-01-01 - 2999-01-01
检查滞后函数sql server的哪个版本?sql server版本是2014它应该返回介于之间的行和介于之间的行,因此在本例中,它应该返回第3行,dateEff作为问题,而第4行,dateEff,DateExp作为dateRangejpw是正确的。我只是使用了一个示例(我认为保持简单)它们都应该被退回Hanks@APH这很有帮助,不是我想要的确切结果,但确实给了我可以使用的结果
Prob Id Problem Date Affected Id Aff Date Range
3 2013-03-30 4 2013-01-01 - 2015-02-10
3 2013-03-30 5 2013-01-01 - 2999-01-01