SQL根据另一个表中的日期范围查找日期在表中的位置

时间:2015-01-10 19:19:46

标签: mysql sql postgresql date

我正在尝试做一些我认为在SQL中相当简单的事情。我看过this solution,但我认为它与我正在寻找的完全相同(因为我没有Code列)。我有一个看起来像这样的表(还有其他列,但它们没有考虑到这个问题所以我为了简洁起见省略了它们):

TABLE T1

   ID  | CODE | DATE                 | ...
 ------------------------------------------
   0   |  A1  | 2013-01-17 00:00:00  | ...
   1   |  A1  | 2014-02-01 00:00:00  | ...
   2   |  B5  | 2014-06-30 00:00:00  | ...
   3   |  C1  | 2013-12-01 00:00:00  | ...
   4   |  B5  | 2012-04-20 00:00:00  | ...

然后在另一张表中,我有关于这些代码的信息,如下所示:

TABLE T2

  STARTDATE           | ENDDATE             | CODE | DESCRIPTION     | ...
 --------------------------------------------------------------------------
  2012-01-01 00:00:00 | 2013-05-17 00:00:00 |  A1  | No room         | ...
  2013-05-17 00:00:00 | 2014-12-31 00:00:00 |  A1  | Not extra room  | ...
  2011-02-12 00:00:00 | 2013-12-31 00:00:00 |  B5  | Lights          | ...
  2014-01-01 00:00:00 | 2014-08-11 00:00:00 |  B5  | Lights (dim)    | ...

基本上,T1中的每个代码都会匹配T2中的代码,但该代码的说明会根据日期而变化。因此,我遇到的问题是在T2中找到与T1中的代码相对应的说明,但它必须位于正确的范围[STARTDATE, ENDDATE]中。

例如,ID=0中的T1会有描述“没有空间”,而ID=1会根据T1中的日期描述“不是额外的空间”。

编辑:我真的认为我让它变得比以往更难。它是否像WHERE子句中那样简单:

WHERE T1.DATE >= T2.STARTDATE and T1.DATE <= T2.ENDDATE

1 个答案:

答案 0 :(得分:1)

您正在寻找这样的查询吗?

SELECT *
FROM T1
INNER JOIN t2 on t1.code = t.code and t1.date >= t2.startdate and t1.date <= t2.enddate
...