查找仅在给定日期之前的记录(SQL)

查找仅在给定日期之前的记录(SQL),sql,left-join,exists,outer-join,Sql,Left Join,Exists,Outer Join,我尝试了多个查询,但都不起作用。 这可能真的很简单 下面是一个示例表: ordernr debnaam debnr orddat 1 Coca-Cola 123 2019-02-07 12 Altec 456 2019-02-07 123 Coca-Cola 123 2016-01-01 1234 Brady 789 2015-03-18 因此,关键是要找到过去两年以来一直没有订购过

我尝试了多个查询,但都不起作用。 这可能真的很简单

下面是一个示例表:

ordernr debnaam     debnr   orddat
1       Coca-Cola   123     2019-02-07
12      Altec       456     2019-02-07
123     Coca-Cola   123     2016-01-01
1234    Brady       789     2015-03-18
因此,关键是要找到过去两年以来一直没有订购过的客户debnaam。 在我的例子中,唯一的记录应该是布雷迪

我尝试了以下查询:

SELECT a.ordernr, a.debnaam, a.debnr, a.orddat 
FROM orkrg as a 
WHERE NOT EXISTS(SELECT b.debnr 
                 FROM orkrg as b 
                 WHERE a.ordernr = b.ordernr 
                 AND b.orddat > CONVERT(date, dateadd(year,-2,getdate())))
或使用左外连接:

SELECT * 
FROM (
      SELECT orkrg.ordernr, orkrg.debnaam, orkrg.debnr, orkrg.orddat 
      FROM orkrg 
      WHERE orkrg.orddat < CONVERT(date, dateadd(year,-2,getdate()))
     ) AS a
LEFT OUTER JOIN 
     (
      SELECT orkrg.ordernr, orkrg.debnaam, orkrg.debnr, orkrg.orddat 
      FROM orkrg 
      WHERE orkrg.orddat > CONVERT(date, dateadd(year,-2,getdate()))
     ) as b 
  ON a.ordernr = b.ordernr
谁能帮帮我吗

谢谢

您需要使用DATEDIFF过滤掉较旧的日期:

SELECT a.ordernr, a.debnaam, a.debnr, a.orddat 
FROM orkrg as a 
WHERE DATEDIFF(year, a.orddat, GETDATE()) > 2
AND A.debnr NOT IN (SELECT b.debnr FROM orkrg as b WHERE
DATEDIFF(year, b.orddat, GETDATE()) <= 2)

默认情况下,我使用“不存在于不存在之上”,请参阅“为什么”

,这将有助于让任何人订购>2年,但必须在过去2年中没有的地方包含一个检查。@Brad good catch,为此编辑。未经测试,但概念现在应该是正确的。假设b.debnr是买家的唯一标识符。这应该有效,性能方面不确定是否存在会更快,但如果他没有大型数据库,则应该可以。您的查询不会在my db中返回任何值。您的datediff语句一定有问题我假设您的datediff语句不存在,请执行一个where>2年的查询,并在过去2年中使用not exist进行查询,以排除最近2年中已订购的数据。此外,您正在将日期转换为日期,假设删除年份,除非您需要在2年前的某一天提前几个小时进行检查,否则您不需要这样做,并且运行您正在使用的dbms需要更长的时间?CONVERT、dateadd等是特定于产品的函数。这很有效!你能解释一下SELECT 1是什么意思吗?Thanks@Jeremy它只是为查询中的每一行返回1。如果返回1,则该行存在,因此在not exists中排除该行。您也可以使用select*或选择某个_列,但1是确定行是否存在所需的全部数据。
SELECT a.ordernr, a.debnaam, a.debnr, a.orddat 
FROM orkrg as a 
WHERE DATEDIFF(year, a.orddat, GETDATE()) > 2
AND A.debnr NOT IN (SELECT b.debnr FROM orkrg as b WHERE
DATEDIFF(year, b.orddat, GETDATE()) <= 2)
select a.*
from orkrg as a
where a.orddat < dateadd(year,-2,getdate()) -- this is kinda not needed
and not exists (select 1  -- NOT EXISTS is a safer option than NOT IN, where a null result can cause issues
                from orkrg as b 
                where a.debnaam = b.debnaam and 
                b.orddat > dateadd(year,-2,getdate()))
select * 
from orders as o 
where o.debnr not in (select debnr 
                      from orders as u 
                      where orddat > CONVERT(date, dateadd(year,-2,getdate())))