Sql server 如何在SQL Server中查找日期间隔?

Sql server 如何在SQL Server中查找日期间隔?,sql-server,tsql,Sql Server,Tsql,我有一张桌子 DATE LEAVEDAYS NXTWRKDAYS 2014-07-01 No NULL 2014-07-02 No NULL 2014-07-03 No NULL 2014-07-04 No NULL 2014-07-05 Yes NULL 2014-07-06 Yes NULL 2014-07-07 Yes NULL 2014-07-08 No NULL 2014-07-09 Yes NULL 2014-07-10 Yes NULL 20

我有一张桌子

DATE    LEAVEDAYS   NXTWRKDAYS
2014-07-01  No  NULL
2014-07-02  No  NULL
2014-07-03  No  NULL
2014-07-04  No  NULL
2014-07-05  Yes NULL
2014-07-06  Yes NULL
2014-07-07  Yes NULL
2014-07-08  No  NULL
2014-07-09  Yes NULL
2014-07-10  Yes NULL
2014-07-11  No  NULL
输出将是

DATE        LEAVEDAYS   NXTWRKDAYS
2014-07-01  No      2014-07-02
2014-07-02  No      2014-07-03
2014-07-03  No      2014-07-04
2014-07-04  No      2014-07-05
2014-07-05  Yes     2014-07-08
2014-07-06  Yes     2014-07-08
2014-07-07  Yes     2014-07-08
2014-07-08  No      2014-07-09 
2014-07-09  Yes     2014-07-11
2014-07-10  Yes     2014-07-11
2014-07-11  No      2014-07-12
可以看出,2014-07-04之后的下一个工作日为“2014-07-08”,此后2014-07-05之后的产量为2014-07-08。 2014-07-10之后的下一个工作日为“2014-07-11”,此后2014-07-10之后的产量为2014-07-11

脚本

declare @t table([DATE] DATE,LEAVEDAYS Varchar(10),NXTWRKDAYS DATE)
insert into @t Values
('2014-07-01','No',NULL),
('2014-07-02','No',NULL),
('2014-07-03','No',NULL),
('2014-07-04','No',NULL),
('2014-07-05','Yes',NULL),
('2014-07-06','Yes',NULL),
('2014-07-07','Yes',NULL),
('2014-07-08','No',NULL),
('2014-07-09','Yes',NULL),
('2014-07-10','Yes',NULL),
('2014-07-11','No',NULL)

select *
from @t

您可以使用
APPLY
TOP
获得所需的结果:

SELECT
    t.[DATE],
    t.LEAVEDAYS,
    NXTWRKDAYS = x.[DATE]
FROM @t t
OUTER APPLY(
    SELECT TOP 1 [DATE]
    FROM @t
    WHERE 
        [DATE] > t.[DATE]
        AND LEAVEDAYS = CASE WHEN t.LEAVEDAYS = 'YES' THEN 'NO' ELSE LEAVEDAYS END          
) x

您可以使用
APPLY
TOP
获得所需的结果:

SELECT
    t.[DATE],
    t.LEAVEDAYS,
    NXTWRKDAYS = x.[DATE]
FROM @t t
OUTER APPLY(
    SELECT TOP 1 [DATE]
    FROM @t
    WHERE 
        [DATE] > t.[DATE]
        AND LEAVEDAYS = CASE WHEN t.LEAVEDAYS = 'YES' THEN 'NO' ELSE LEAVEDAYS END          
) x

检查此查询,希望它能帮助您:

创建表和插入脚本:

declare @t table([DATE] DATE,LEAVEDAYS Varchar(10),NXTWRKDAYS DATE)
insert into @t Values
('2014-07-01','No',NULL),
('2014-07-02','No',NULL),
('2014-07-03','No',NULL),
('2014-07-04','No',NULL),
('2014-07-05','Yes',NULL),
('2014-07-06','Yes',NULL),
('2014-07-07','Yes',NULL),
('2014-07-08','No',NULL),
('2014-07-09','Yes',NULL),
('2014-07-10','Yes',NULL),
('2014-07-11','No',NULL)
SELECT 
     t.date AS Date,
     t.leavedays AS LeaveDays, 
     CASE WHEN t.LEAVEDAYS = 'No' THEN DATEADD(day,1, t.DATE) 
          WHEN t.LEAVEDAYS = 'Yes' THEN (Select top 1 t1.date from @t t1 WHERE t1.date > t.DATE and t1.LEAVEDAYS = 'No' ORDER BY t1.date) 
          ELSE null END AS NxtWorkingDay
FROM @t t
所需输出:

declare @t table([DATE] DATE,LEAVEDAYS Varchar(10),NXTWRKDAYS DATE)
insert into @t Values
('2014-07-01','No',NULL),
('2014-07-02','No',NULL),
('2014-07-03','No',NULL),
('2014-07-04','No',NULL),
('2014-07-05','Yes',NULL),
('2014-07-06','Yes',NULL),
('2014-07-07','Yes',NULL),
('2014-07-08','No',NULL),
('2014-07-09','Yes',NULL),
('2014-07-10','Yes',NULL),
('2014-07-11','No',NULL)
SELECT 
     t.date AS Date,
     t.leavedays AS LeaveDays, 
     CASE WHEN t.LEAVEDAYS = 'No' THEN DATEADD(day,1, t.DATE) 
          WHEN t.LEAVEDAYS = 'Yes' THEN (Select top 1 t1.date from @t t1 WHERE t1.date > t.DATE and t1.LEAVEDAYS = 'No' ORDER BY t1.date) 
          ELSE null END AS NxtWorkingDay
FROM @t t

检查此查询,希望它能帮助您:

创建表和插入脚本:

declare @t table([DATE] DATE,LEAVEDAYS Varchar(10),NXTWRKDAYS DATE)
insert into @t Values
('2014-07-01','No',NULL),
('2014-07-02','No',NULL),
('2014-07-03','No',NULL),
('2014-07-04','No',NULL),
('2014-07-05','Yes',NULL),
('2014-07-06','Yes',NULL),
('2014-07-07','Yes',NULL),
('2014-07-08','No',NULL),
('2014-07-09','Yes',NULL),
('2014-07-10','Yes',NULL),
('2014-07-11','No',NULL)
SELECT 
     t.date AS Date,
     t.leavedays AS LeaveDays, 
     CASE WHEN t.LEAVEDAYS = 'No' THEN DATEADD(day,1, t.DATE) 
          WHEN t.LEAVEDAYS = 'Yes' THEN (Select top 1 t1.date from @t t1 WHERE t1.date > t.DATE and t1.LEAVEDAYS = 'No' ORDER BY t1.date) 
          ELSE null END AS NxtWorkingDay
FROM @t t
所需输出:

declare @t table([DATE] DATE,LEAVEDAYS Varchar(10),NXTWRKDAYS DATE)
insert into @t Values
('2014-07-01','No',NULL),
('2014-07-02','No',NULL),
('2014-07-03','No',NULL),
('2014-07-04','No',NULL),
('2014-07-05','Yes',NULL),
('2014-07-06','Yes',NULL),
('2014-07-07','Yes',NULL),
('2014-07-08','No',NULL),
('2014-07-09','Yes',NULL),
('2014-07-10','Yes',NULL),
('2014-07-11','No',NULL)
SELECT 
     t.date AS Date,
     t.leavedays AS LeaveDays, 
     CASE WHEN t.LEAVEDAYS = 'No' THEN DATEADD(day,1, t.DATE) 
          WHEN t.LEAVEDAYS = 'Yes' THEN (Select top 1 t1.date from @t t1 WHERE t1.date > t.DATE and t1.LEAVEDAYS = 'No' ORDER BY t1.date) 
          ELSE null END AS NxtWorkingDay
FROM @t t

2014-07-04
的下一个工作日不应该是
2014-07-08
2014-07-04
的下一个工作日不应该是
2014-07-08