Sql server DATEDIFF和NULL用于查找过去N天内的不完整记录

Sql server DATEDIFF和NULL用于查找过去N天内的不完整记录,sql-server,null,where,outer-join,datediff,Sql Server,Null,Where,Outer Join,Datediff,我正在使用DATEDIFF并为NULL来查找在特定天数内丢失数据的记录, 例如,这里我试图找到1095天没有上课的学生 (3年),如果他们是注册学生,不参加任何课程的时间不得超过3年。我想我做得对,只是要确定一下。正如我所了解的,在外部联接之后,所有列都返回,您可以在WHERE中过滤您不想要的列 SELECT DISTINCT stu.campusID AS [Campus ID], camp.name AS [School], stu.studentID AS [Stu

我正在使用DATEDIFF并为NULL来查找在特定天数内丢失数据的记录, 例如,这里我试图找到1095天没有上课的学生 (3年),如果他们是注册学生,不参加任何课程的时间不得超过3年。我想我做得对,只是要确定一下。正如我所了解的,在外部联接之后,所有列都返回,您可以在WHERE中过滤您不想要的列

SELECT DISTINCT
    stu.campusID AS [Campus ID],
    camp.name AS [School],
    stu.studentID AS [Student ID],
    stu.lName AS [Last Name],
    stu.fName AS [First Name]

FROM
    students stu
    LEFT OUTER JOIN
    coursesTaken cour
    ON
    cour.campusID = stu.campusID
    AND
    cour.studentID = stu.studentID
    AND
    DATEDIFF(D, cour.dateTaken, GETDATE()) >= 1095
    INNER JOIN
    campusNames camp
    ON
    camp.campusID = stu.campusID

WHERE
    cour.dateTaken IS NULL

如果你想找到过去3年没有参加过任何课程的学生,有几件事我会改变:

SELECT
    stu.campusID AS [Campus ID],
    camp.name AS [School],
    stu.studentID AS [Student ID],
    stu.lName AS [Last Name],
    stu.fName AS [First Name]

FROM
    students stu
      INNER JOIN
    campusNames camp
      ON
        camp.campusID = stu.campusID
WHERE
    NOT EXISTS (SELECT * FROM coursesTaken co
           where co.StudentID = stu.StudentID and
           co.DateTaken > DATEADD(year,-3,GETDATE())

希望它读起来更清晰/更接近您的规范(如果实际需要,您可以将
日期添加
改回使用1095天,但如果是3年,则上述更好,因为它考虑了闰年)

您的问题是什么?我的问题是日期差是否在正确的位置?我想我已经知道了。我忘记了不存在,对我来说,这种方法比外部连接保留边和非保留边并确定哪些项目去哪里更容易理解。谢谢从性能的角度来看,这也要好得多。使用效率极高的
notexists
不仅可以提高性能
DATEADD(year,-3,GETDATE())
是在运行时之前计算的,因此匹配应该能够非常有效地查找索引中的日期。好的,谢谢Zane,查找没有课的学生只是我使用的一个示例,基本上是尝试查找x中有y且N天没有z的人。就像你被送进医院,好几天没有得到帮助一样。医院可能有7天的阈值。@Chris-Zane提出的一般观点是,只要有可能,你应该根据常量或
GETDATE()
进行任何日期计算,而不是对你的列进行计算。如果你用你的列做日期数学,那么这些列上的任何索引都是无用的。@Damien_The_unsiever抓住了!记下备查,再次感谢!