在开始/结束日期

在开始/结束日期

问题描述:

多个记录分割记录我正在寻找一个解决方案,我必须使用来自另一个表中的数据的一个记录创建一组记录。表定义:在开始/结束日期

DECLARE A AS TABLE 
(
AID BIGINT NOT NULL, 
StartDate DATETIME NOT NULL, 
EndDate DATETIME 
) 

DECLARE B AS TABLE 
(
AID BIGINT NOT NULL, 
StartDate DATETIME NOT NULL, 
EndDate DATETIME NULL 
) 

的想法是,当A含有:

1 | 01-01-2010 | 01-02-2010 
2 | 01-10-2010 | 31-10-2010 

和B包含:

1 | 01-01-2010 | 15-01-2010 
2 | 15-10-2010 | 20-10-2010 

我们收到5条:

1 | 01-01-2010 | 15-01-2010 
1 | 16-01-2010 | 01-02-2010 
2 | 01-10-2010 | 15-10-2010 
2 | 16-10-2010 | 20-10-2010 
2 | 21-10-2010 | 31-10-2010 

目前我们用A和inne上的光标来做到这一点对B r的循环光标,我们不得不这样做在SQLServer的(TSQL或在最坏的情况下,CLR)

如何编写这是一个选择,使光标的开销消失任何想法?

+0

目前尚不清楚生成5条记录的规则是什么。说明你想在英语 – smirkingman 2010-11-22 13:13:09

+0

实现什么?答有时间,B中有“子”期,期间的foreach B中,我们需要拆分在一个时期 – 2010-11-22 13:41:12

DECLARE @A TABLE (AID BIGINT NOT NULL, StartDate DATETIME NOT NULL, EndDate DATETIME) 
DECLARE @B TABLE (AID BIGINT NOT NULL, StartDate DATETIME NOT NULL, EndDate DATETIME NULL) 

SET DATEFORMAT dmy 
INSERT @A VALUES (1 ,'01-01-2010','01-02-2010') 
INSERT @A VALUES (2 ,'01-10-2010','31-10-2010') 
INSERT @B VALUES (1 ,'01-01-2010','15-01-2010') 
INSERT @B VALUES (2 ,'15-10-2010','20-10-2010') 

;WITH transitions as 
(
    SELECT *, ROW_NUMBER() OVER (PARTITION BY AID ORDER BY startdate) Sequence 
    FROM (
     SELECT A.AID, A.startdate 
     FROM @a A 
     UNION 
     SELECT A.AID, B.startdate + 1 
     FROM @A A 
     INNER JOIN @b B ON B.startdate > A.startdate AND B.startdate < A.enddate 
     UNION 
     SELECT A.AID, B.enddate + 1 
     FROM @A A 
     INNER JOIN @b B ON B.enddate > A.startdate AND B.enddate < A.enddate 
     UNION 
     SELECT A.AID, A.enddate + 1 
     FROM @a A 
     WHERE A.enddate > A.startdate 
    ) T 
) 
SELECT T1.AID, T1.startdate startdate, T2.startdate - 1 enddate 
FROM transitions T1 
INNER JOIN transitions T2 ON T2.AID = T1.AID AND T2.Sequence = T1.Sequence + 1 
ORDER BY T1.AID, T1.Sequence