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