SQL查询从周期表中排除日期范围

阿卜杜拉·梅希尔

我有一个句点,我想排除日期范围

举个例子

id   startDate  endDate
316  2015-02-01     NULL

排除表

id    ExclusionStartDate ExclusionEndDate

316   2015-02-15         2015-02-18     
316   2015-03-10         2015-03-15 
316   2015-04-01         2015-04-30    

我搜索结果:

Id       startDate            endDate

316   2015-02-01              2015-02-14 
316   2015-02-19              2015-03-09 
316   2015-03-16              2015-03-31 
316   2015-05-01              null

我可以使用递归查询吗?

乔基·纳库里(Giorgi Nakeuri)

尝试:

DECLARE @i TABLE(id int, sd DATE, ed DATE)
DECLARE @e TABLE(id int, sd DATE, ed DATE)

INSERT INTO @i VALUES
(316, '20150201', NULL),
(317, '20150202', NULL)
INSERT INTO @e VALUES
(316, '20150215', '20150218'),
(316, '20150310', '20150315'),
(316, '20150401', '20150430'),
(317, '20150405', '20150530')


;WITH cte AS
(
    SELECT id, sd, ROW_NUMBER() OVER(PARTITION BY id ORDER BY ord, sd) AS rn FROM 
    (
      SELECT id, sd, 0 AS ord FROM @i
      UNION ALL
      SELECT id, DATEADD(dd, -1, sd), 1 AS ord FROM @e
      UNION ALL
      SELECT id, DATEADD(dd, 1, ed), 1 AS ord FROM @e
      UNION ALL
      SELECT id, ed, 2 AS ord FROM @i
    ) t
)

SELECT c1.id, c1.sd, c2.sd AS ed FROM cte c1
JOIN cte c2 ON c1.rn + 1 = c2.rn AND c1.id = c2.id
WHERE c2.rn % 2 = 0
ORDER BY c2.id, c2.rn

输出:

id  sd          ed
316 2015-02-01  2015-02-14
316 2015-02-19  2015-03-09
316 2015-03-16  2015-03-31
316 2015-05-01  NULL
317 2015-02-02  2015-04-04
317 2015-05-31  NULL

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章