sql - Datediff() 查找日期差异的替代方法是什么?
问题描述
我正在尝试编写一个查询,该查询返回超过 5 个月未参加任何课程的学生列表。我认为我的逻辑是正确的,但我无法在 SQL Plus 中使用 Datediff()。我想知道是否还有其他方法。
询问:
SELECT s.Reg_No, s.First_Name, s.Last_Name, s.Admission_Date
FROM Student s
INNER JOIN Enrolled_In e ON s.Reg_No = e.Reg_No
WHERE (s.Reg_No != e.Reg_No) AND (DATEDIFF(months, GETDATE(), s.Admission_Date) > 5);
解决方案
甲骨文有一个months_between
功能:
AND MONTHS_BETWEEN(sysdate, s.Admission_Date) > 5
您还可以使用该add_months
功能:
AND s.Admission_Date < ADD_MONTHS(sysdate, -5)
如果有的话,它仍然可以在该列上使用索引。
您可以使用间隔,但使用月份间隔进行加/减可能会因为月份长度不同而导致问题。
你的逻辑看起来不正确。首先,您将reg_no
值与=
和进行比较!=
,这不能同时为真。您也在查看s.admission_date
,而不是 的日期enrolled_in
。
您想查找在过去五个月内没有注册课程的学生,因此您可以找到最近的注册并过滤这些学生,例如(假设您有一个名为enrolled_date
您需要检查的列):
SELECT s.Reg_No, s.First_Name, s.Last_Name, s.Admission_Date
FROM Student s
INNER JOIN Enrolled_In e ON s.Reg_No = e.Reg_No
GROUP BY s.Reg_No, s.First_Name, s.Last_Name, s.Admission_Date
HAVING MAX(e.Enrolled_Date) < ADD_MONTHS(sysdate, -5)
这将找到在某个时间注册但不是在过去五个月内注册的学生。如果您想包括从未注册过的学生,您可以使用外部联接:
SELECT s.Reg_No, s.First_Name, s.Last_Name, s.Admission_Date
FROM Student s
LEFT OUTER JOIN Enrolled_In e ON s.Reg_No = e.Reg_No
AND e.Enrolled_Date >= ADD_MONTHS(sysdate, -5)
GROUP BY s.Reg_No, s.First_Name, s.Last_Name, s.Admission_Date
HAVING COUNT(e.Enrolled_Date) = 0
或者由于您没有报告任何注册数据,您可以使用not exists
子查询来查找任何最近的课程:
SELECT s.Reg_No, s.First_Name, s.Last_Name, s.Admission_Date
FROM Student s
WHERE NOT EXISTS (
SELECT null
FROM Enrolled_In e
WHERE e.Reg_No = s.Reg_No
AND e.Enrolled_Date >= ADD_MONTHS(sysdate, -5)
);
查找学生表中存在但已注册表中的学生
您也可以使用not exists
查询 - 只需取出日期检查:
SELECT s.Reg_No, s.First_Name, s.Last_Name, s.Admission_Date
FROM Student s
WHERE NOT EXISTS (
SELECT null
FROM Enrolled_In e
WHERE e.Reg_No = s.Reg_No
);
正如您自己发现的那样,使用外连接和空值检查或计数也可以。
推荐阅读
- javascript - 用于随机排列数组的异步函数
- drupal - Drupal 7 模块升级到 Drupal 9
- docker - Openshift HTTP 在 60 秒后超时
- python - Request-html 每次调用函数时获取数据
- c++ - C++ 中带有模板的默认参数
- javascript - 使用 js-cookies,如何轻松将对象设置为 cookie?
- swiftui - 如何通过使用 @EnvironmentObject 来路由视图来导航到项目的详细视图?
- python - werkzeug.exceptions.BadRequestKeyError
- javascript - 如何编写一个接受任何输入的 Typescript hasOwnProperty 类型保护?
- xml - 在基于注释的方法中如何实现松散耦合