加入日期范围查询

时间:2011-04-08 13:01:47

标签: sql sql-server database sql-server-2008

HI
我有以下表格

=========================
Periods
=========================
PeriodID  StartDate   EndDate
1         01-01-11    07-01-11
2         08-01-11    15-01-11

等全年

=========================
History
=========================
PersonID  From       To
1         01-01-11  05-04-11
2         17-06-11   NULL 
and so on

我想要以下输出

 StartDate   EndDate   PersonID
  01-01-11    07-01-11    1
  08-01-11    15-01-11    1
  .
  .
  15-04-11   21-04-11     NULL
  .
  .
  15-06-11   21-06-11     2

我需要在这两个表之间进行连接,但我无法确定连接条件是如何看起来像

Ragards

5 个答案:

答案 0 :(得分:5)

SELECT
  p.StartDate,
  p.EndDate,
  h.PersonID
FROM Periods p
  LEFT JOIN History h
    ON h.[From] BETWEEN p.StartDate AND p.EndDate OR
       p.StartDate BETWEEN h.[From] AND ISNULL(h.[To], '30000101')

答案 1 :(得分:1)

请你试试:

SELECT P.StartDate, P.EndDate, H.PersonID
FROM Period P INNER JOIN History H ON P.StartDate <= H.Fromand (P.EndDate >= H.To OR H.To IS NULL)

我在更清楚地阅读规范后编辑了SQL

我再次编辑了SQL。我现在正在使用INNER JOIN。

答案 2 :(得分:1)

这会影响性能,但我认为值得尝试奇怪的看法:

select x
from table1 t1
  inner join table2 t2
    on t2.date between t1.startdate and t1.enddate

它是否有效将取决于这是生产,还是只是一次性,以及涉及多少记录。这可能太慢了。

答案 3 :(得分:1)

您需要执行左连接才能显示所有可用期间,即使没有与该期间关联的历史记录条目也是如此。如果历史日期在期间之间,则标准是。您还需要检查To date是否为null并将其包含在结果中

SELECT  p.StartDate, p.EndDate, h.PersonId
FROM    Period p
        LEFT JOIN History h
            ON p.StartDate >= h.[From] AND 
            (h.[To] IS NULL OR p.EndDate <= h.[To])

答案 4 :(得分:-1)

在表格&#39;历史&#39;,将NULL设置为&#39; 9999-12-31&#39;

从a.from&lt;中的内部联接历史记录b中选择* b.to和a.to&gt; b.from