SQL 命令SELECT * FROM tb1 WHERE tb1.DATES < '05-01-2010' AND tb1.DATES > '05-02-2010' 要求“查找 'dates' 字段在 5 月 1 日之前和 5 月 2 日之后的所有行”,如果用英文输入,显然没有。
相反,该命令应该询问“查找所有记录在 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;
或使用 INTERSECT
SELECT DISTINCT tb1.ID
FROM mytable tb1
WHERE tb1.[dates] < '20100501'
INTERSECT
SELECT mt2.ID
FROM mytable mt2
WHERE mt2.[dates] > '20100502';
在上面使用 DISTINCT 是为了让每个 ID 只获得一行,无论它们在相关日期之前/之后有多少行。
您也可以通过 GROUP BY 和 HAVING 来执行此操作 - 在这种特殊情况下很容易,就好像任何日期都在 5 月 1 日之前,那么它们的最早日期必须在 5 月 1 日之前(相应地,它们的最大数据和 5 月 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”(因为这些使它们模棱两可)。
不同的国家/服务器/等会以不同的方式转换您在那里的日期,例如SQL Server UTC string comparison not working