我有两个表都有列StartDate和EndDate。寻找补充日期范围?
我想返回一个结果集,它包含一个表(TableA)中的所有日期范围,以及另一个表(TableB)的所有补充日期范围。
CREATE TABLE [dbo].[TableA](
[ID] [int] NOT NULL,
[StartDate] [datetime] NOT NULL,
[EndDate] [datetime] NOT NULL
)
CREATE TABLE [dbo].[TableB](
[ID] [int] NOT NULL,
[StartDate] [datetime] NOT NULL,
[EndDate] [datetime] NOT NULL
)
INSERT INTO TableA (ID, StartDate, EndDate) VALUES(1, '4/1/2009', '8/1/2009')
INSERT INTO TableA (ID, StartDate, EndDate) VALUES(1, '10/1/2009', '12/1/2009')
INSERT INTO TableB (ID, StartDate, EndDate) VALUES(1, '1/1/2009', '2/1/2010')
INSERT INTO TableA (ID, StartDate, EndDate) VALUES(2, '4/1/2009', '8/1/2009')
INSERT INTO TableB (ID, StartDate, EndDate) VALUES(2, '1/1/2009', '5/1/2009')
INSERT INTO TableB (ID, StartDate, EndDate) VALUES(2, '7/1/2009', '12/1/2009')
从三个数据集的预期结果集应该是:
(ID = 1)
1/1/2009 - 4/1/2009 (from TableB)
4/1/2009 - 8/1/2009 (from TableA)
8/1/2009 - 10/1/2009 (from TableB)
10/1/2009 - 12/1/2009 (from TableA)
12/1/2009 - 2/1/2010 (from TableB)
(ID = 2)
1/1/2009 - 4/1/2009 (from TableB)
4/1/2009 - 8/1/2009 (from TableA)
8/1/2009 - 12/1/2009 (from TableB)
日期范围不能保证是连续的,我不能让他们是如何表之间重叠的任何假设......在每个表格中,他们可以被假定为不重叠。
我在围绕如何将TableB中的单个日期范围拆分为多个部分来查找SQL中的所有补充“区域”时遇到了问题。
任何人有任何建议吗?
在此上下文中定义“补充”。 – 2009-12-28 21:04:07
你有几行?性能是一个问题吗? – 2009-12-28 21:10:53
我认为他意味着他想要A中的所有行,加上B中所有与A中的任何时段都不重叠的时段的部分。换句话说:“一个联合(B减去(B相交A))',因此A和B'是不相交的并且'A联合B'==联合B'。 – 2009-12-28 21:53:44