从单个列控制表(SQL Server)执行日期范围查询

时间:2012-03-23 11:38:48

标签: sql-server datetime select

假设我有以下表格

TABLEA

seq datea
1   2010-01-01
2   2010-02-01
3   2010-03-01

表B

dateb      sthvalue
2010-01-11 AAA
2010-01-12 AAB
2010-02-03 CCC
2010-02-06 CCD
2010-02-10 CCE
2010-03-05 FFF

我想加入tableb.dateb上的两个表位于tablea的日期范围内

即。输出应该是

seq datea      dateb      sthvalue
1   2010-01-01 2010-01-11 AAA
1   2010-01-01 2010-01-12 AAB
2   2010-02-01 2010-02-03 CCC
2   2010-02-01 2010-02-06 CCD
2   2010-02-01 2010-02-10 CCE
3   2010-03-01 2010-03-05 FFF

非常感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

我相信你要求的是加入年月和月份

select 
      seq,datea,dateb,sthvalue 
from 
      TableA inner join Tableb 
      on datepart(year,datea) = datepart(year,dateb) and 
         datepart(month,datea) = datepart(month,dateb)
      order by seq,dateb

答案 1 :(得分:1)

假设表A的值总是相隔一个月并且在每个月的第1天设置,那么现有答案就可以了。

如果您的表A可以包含更多种类:

SELECT
    *
FROM
    TableB b
       inner join
    TableA a
       on
          b.dateb >= a.datea
       left join
    TableA a_nolater
       on
          a_nolater.datea > a.datea and
          b.dateb >= a_nolater.datea
WHERE
    a_nolater.seq is null

这将两个表连接在一起,然后尝试找到一个“更好”的连接(tablea中的一行比当前匹配的一个更晚,并且仍然是tableb的匹配)。它只返回无法找到“更好”连接的行。因此,它在tableA中找到最新的日期行,该行在tableB的日期之前或之前。

答案 2 :(得分:0)

你可以

select
    a.seq,
    a.datea,
    b.dateb,
    b.sthvalue
from 
    tablea a inner join tableb b on (b.dateb >= a.datea and b.dateb < dateadd(month, 1, a.datea))
order by 
    a.seq, b.sthvalue