Datediff() 的替代方法是什么来查找日期差异?
What is the alternate of Datediff() to find the date difference?
我正在尝试编写一个查询,其中 returns 超过 5 个月未注册任何 class 的学生列表。我想我的逻辑是正确的,但我无法在 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);
Oracle 有一个 months_between
function:
AND MONTHS_BETWEEN(sysdate, s.Admission_Date) > 5
您也可以使用 add_months
function:
AND s.Admission_Date < ADD_MONTHS(sysdate, -5)
它仍然可以在该列上使用索引,如果有的话。
您可以使用间隔,但是 addition/subtraction 使用月份间隔可能会因为月份长度不同而导致问题。
虽然你的逻辑看起来不对。首先,您将 reg_no
值与 =
和 !=
进行比较,这两个值不能同时为真。您也在查看 s.admission_date
,而不是来自 enrolled_in
.
的日期
您想查找在过去五个月内未注册 class 的学生,因此您可以找到最近的注册并过滤这些,例如(假设您有一个名为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)
);
find the students which are in present in student table but not in enrolled table
您也可以使用 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
);
正如您自己发现的那样,使用外部连接和 null 检查或计数也有效。
我认为你的查询逻辑不对。如果您想要过去 5 个月未注册的学生,这可以通过使用获取最后注册日期的相关子查询过滤学生 table 来表达:
select s.*
from students s
where
(
select max(e.admission_date)
from enrolled_in e
where e.reg_no = e.reg_no
) < sysdate - interval '5' month
or not exists (
select 1
from enrolled_in e
where e.reg_no = e.reg_no
)
我正在尝试编写一个查询,其中 returns 超过 5 个月未注册任何 class 的学生列表。我想我的逻辑是正确的,但我无法在 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);
Oracle 有一个 months_between
function:
AND MONTHS_BETWEEN(sysdate, s.Admission_Date) > 5
您也可以使用 add_months
function:
AND s.Admission_Date < ADD_MONTHS(sysdate, -5)
它仍然可以在该列上使用索引,如果有的话。
您可以使用间隔,但是 addition/subtraction 使用月份间隔可能会因为月份长度不同而导致问题。
虽然你的逻辑看起来不对。首先,您将 reg_no
值与 =
和 !=
进行比较,这两个值不能同时为真。您也在查看 s.admission_date
,而不是来自 enrolled_in
.
您想查找在过去五个月内未注册 class 的学生,因此您可以找到最近的注册并过滤这些,例如(假设您有一个名为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)
);
find the students which are in present in student table but not in enrolled table
您也可以使用 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
);
正如您自己发现的那样,使用外部连接和 null 检查或计数也有效。
我认为你的查询逻辑不对。如果您想要过去 5 个月未注册的学生,这可以通过使用获取最后注册日期的相关子查询过滤学生 table 来表达:
select s.*
from students s
where
(
select max(e.admission_date)
from enrolled_in e
where e.reg_no = e.reg_no
) < sysdate - interval '5' month
or not exists (
select 1
from enrolled_in e
where e.reg_no = e.reg_no
)