检查日期是否在上一行开始日期和结束日期之间

use*_*693 0 sql t-sql sql-server date sql-server-2008

我有以下示例数据:

id  Ref     User        Task    Refernce    Start   End         rn
1   12222   Joe Bloggs  Task 1  Ref001  24/02/2014  20/07/2014  1
2   12568   Joe Bloggs  Task 1  Ref001  25/07/2014  12/10/2014  2
3   14757   Joe Bloggs  Task 1  Ref001  29/10/2014  11/01/2015  3
4   12493   Joe Bloggs  Task 1  Ref001  7/01/2015   6/04/2015   4
5   13694   Joe Bloggs  Task 2  Ref001  3/04/2014   20/07/2014  1
6   85569   Joe Bloggs  Task 2  Ref001  18/07/2014  12/10/2014  2
7   54769   Joe Bloggs  Task 2  Ref001  24/11/2014  5/01/2015   3
8   89716   Joe Bloggs  Task 2  Ref001  12/01/2015  6/04/2015   4
Run Code Online (Sandbox Code Playgroud)

我需要检查任何开始/结束日期在任务类型相同的前一个开始/结束日期之间的位置.

在上面的数据中,标记为重叠的行将是:

4   12493   Joe Bloggs  Task 1  Ref001  7/01/2015   6/04/2015   4
Run Code Online (Sandbox Code Playgroud)

因为07/01/2015重叠的开始日期是3的结束日期11/01/15

6   85569   Joe Bloggs  Task 2  Ref001  18/07/2014  12/10/2014  2
Run Code Online (Sandbox Code Playgroud)

因为因为18/07/2014重叠的开始日期是1结束日期20/07/14

如果不使用游标,有人可以建议如何做到这一点吗?

Gor*_*off 5

您可以lag()在SQL Server 2012+中执行此操作.在SQL Server 2008中,我建议join:

select s.*,
       (case when s.start between s2.start and s2.end then 1 else 0 end) as flg
from sample s left outer join
     sample sprev
     on s.id = sprev.id + 1;
Run Code Online (Sandbox Code Playgroud)