【发布时间】:2010-12-30 14:28:02
【问题描述】:
我有两个表,它们都有列 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 中找到其中的所有补充“区域”时遇到了问题。
大家有什么建议吗?
【问题讨论】:
-
在此上下文中定义“补充”。
-
你有多少行?性能是个问题吗?
-
PS +1 关于在创建脚本中包含测试数据的问题。如果您没有制作创建脚本,我可能不会为这个问题而烦恼,因为自己制作它们太无聊了(即使它不会花费那么长时间)。我希望更多的人花时间来做这件事,以节省其他人的努力。
-
好的,根据实际情况调整解决方案并将生产数据复制到我的开发环境中。 TableB 中有 77K 条记录,TableA 中有 5K 条记录(我完成项目后会少很多)。视图上的总运行时间:17 秒,产生 96K 行。这还不错,但绝对可以通过相关表中的更好索引来改进。当 TableA 有 100 条记录时,它在不到一秒的时间内运行。
-
通过适当的索引,运行时间减少到 1 秒。非常好!
标签: sql sql-server sql-server-2005 date-range complement