如何根据日期过滤 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'
我有以下 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'