1

我有一个“日期”表,类似于:

id       date
----------------
1     2012-02-02
2     2013-02-02
3     2014-04-06

和一个类似的“date_range”表:

   start           end
--------------------------
2011-01-01      2013-01-01
2014-01-01      2016-01-01

如何从日期不在“date_range”表条目之一之间的“日期”表中获取结果?

预期结果是 id->2, date->2013-02-02。

我试过了:

SELECT * FROM date
JOIN date_range
    ON date.date NOT BETWEEN date_range.start AND date_range.end

和明显的失败:

SELECT * FROM date 
WHERE date.date NOT BETWEEN (SELECT start, end FROM date_range)
4

3 回答 3

1
SELECT * FROM date
LEFT JOIN date_range
    ON date.date >= date_range.start AND date.date <= date_range.end
WHERE date_range.start IS NULL
于 2013-08-13T21:35:03.840 回答
0

这会做到的。您需要 LEFT OUTER JOIN 以便包含 DATETABE 中的所有记录。

SELECT  D.ID
        ,D.DATE
FROM    DATETABLE D
LEFT OUTER JOIN
        DATE_RANGE DR
ON      D.DATE >= DR.START
AND     D.DATE <= DR.END
WHERE   DR.START IS NULL
于 2013-08-13T21:37:54.777 回答
0

采用NOT EXISTS

SELECT * FROM [Date] D
WHERE NOT EXISTS
(
    SELECT 1 FROM Date_Range DR
    WHERE D.[Date] >= DR.[Start]
      AND D.[Date] <= DR.[End]
)

演示

于 2013-08-13T21:40:33.310 回答