如何根据日期过滤 ID?

How to filter IDs based on dates?

我有以下 table:

ID | DATES
---+-----------
1   02-09-2010
2   03-08-2011
1   08-01-2011
3   04-03-2010

我正在寻找至少有一个日期在 05-01-2010 之前并且至少有一个日期在 05-02-2010 之后的 ID

我尝试了以下方法:

WHERE tb1.DATES < '05-01-2010' AND tb1.DATES > '05-02-2010'

我认为这是不正确的,因为我这样做时没有得到正确的 ID,而且这个逻辑有问题。

谁能解释一下我做错了什么?

SQL 命令 SELECT * FROM tb1 WHERE tb1.DATES < '05-01-2010' AND tb1.DATES > '05-02-2010' 要求“查找 'dates' 字段在 5 月 1 日之前和 5 月 2 日之后的所有行”,当用英语表达时,这显然是none 个。

相反,该命令应该询问“查找所有具有 5 月 1 日之前的记录和 5 月 2 日之后的记录的 ID”- 创建需要查看每个 ID 的多个记录。

正如@Martheen 所建议的,您可以使用两个(子)查询来做到这一点,例如,

SELECT A.ID
FROM
    (SELECT DISTINCT tb1.ID
      FROM mytable tb1
      WHERE tb1.[dates] < '20100501'
    ) AS A
INNER JOIN
    (SELECT DISTINCT tb1.ID
      FROM mytable tb1
      WHERE tb1.[dates] > '20100502'
    ) AS B
    ON A.ID = B.ID;

或使用相交

SELECT DISTINCT tb1.ID
    FROM mytable tb1
    WHERE tb1.[dates] < '20100501'
INTERSECT
    SELECT mt2.ID
    FROM mytable mt2
    WHERE mt2.[dates] > '20100502';

在上面使用 DISTINCT 是为了让每个 ID 只得到一行,无论它们有多少行 before/after 相关日期。

您也可以通过 GROUP BY 和 HAVING 来做到这一点——在这种特殊情况下这很容易,就好像任何日期都在 5 月 1 日之前,那么它们的最早日期必须在 5 月 1 日之前(相应地对于它们的最大数据和 2可能)例如,

SELECT mt1.ID
    FROM mytable mt1
    GROUP BY mt1.ID
    HAVING MIN(mt1.[dates]) < '20100501' AND MAX(mt1.[dates]) > '20100502';

这是一个 db<>fiddle,其中包含所有 3 个;都提供相同的答案(一行,ID = 1)。

最后,您应该为日期使用明确的格式。我最喜欢的其中之一是 'yyyyMMdd',没有 dashes/slashes/etc(因为这些使它们变得模棱两可)。

不同的 countries/servers/etc 将以不同的方式转换您在那里的日期,例如

这是使用 between 指定范围的一种解决方案。

SELECT * from Table_name where
From_date BETWEEN '2013-01-03'AND '2013-01-09'

其他的解决方法就是你说的但是逻辑是正确的

SELECT * from Table_name where
From_date > '2010-01-05'AND From_date <'2010-02-05'