查询时间范围
Query time range
我需要的是 select 学生尚未注册的可用注册考试(已完成),而且我遇到问题的考试也是看时间(start/end) 这些可用考试与学生之前注册的某些考试不冲突。
我正在使用 PostgreSQL 和 Clojure。
数据库是这样的:
-- exam ----------------------------------
| exam_id (PK integer) |
| exam_date (date) |
| exam_start_time (time without time zone) |
| exam_end_time (time without time zone) |
| ... |
------------------------------------------
-- student -----------------
| student_redid (PK integer) |
| ... |
----------------------------
-- student_exam --------------
| student_exam_id (PK integer) |
| student_redid (student FK) |
| exam_id (exam FK) |
| ... |
------------------------------
我正在使用的查询 select 可用的考试(使用 :redid 作为参数):
SELECT *
FROM exam ex
WHERE exam_id NOT IN (SELECT exam_id
FROM student_exam
WHERE student_redid = :redid)
ORDER BY ex.exam_id ASC,
ex.exam_date DESC
我需要通过验证可用考试是否与类似查询中的考试不冲突来改进此查询:
SELECT *
FROM student_exam
WHERE student_redid = :redid
好吧,我现在了解BETWEEN的使用,但不明白如何使用嵌套查询来验证时间范围。
如有任何帮助,我们将不胜感激。
谢谢!
- 首先你select这个学生还没有报名的所有考试
- 然后检查该考试是否与该学生已经注册的任何其他考试相冲突
.
SELECT *
FROM exam newEx
WHERE
NOT EXIST (SELECT se.exam_id
FROM student_exam se
WHERE
se.student_redid = :redid
AND se.exam_id = newEx.exam_id)
AND NOT EXIST (SELECT se.exam_id
FROM
student_exam se inner join
exam oldEx on se.exam_id = oldEx.exam_id
WHERE
student_redid = :redid
AND newEx.exam_start_time <= oldEx.exam_end_time
AND newEx.exam_end_time >= oldEx.exam_start_time
AND newEx.exam_date = oldEx.exam_date
)
ORDER BY
newEx.exam_id ASC,
newEx.exam_date DESC
我需要的是 select 学生尚未注册的可用注册考试(已完成),而且我遇到问题的考试也是看时间(start/end) 这些可用考试与学生之前注册的某些考试不冲突。
我正在使用 PostgreSQL 和 Clojure。 数据库是这样的:
-- exam ----------------------------------
| exam_id (PK integer) |
| exam_date (date) |
| exam_start_time (time without time zone) |
| exam_end_time (time without time zone) |
| ... |
------------------------------------------
-- student -----------------
| student_redid (PK integer) |
| ... |
----------------------------
-- student_exam --------------
| student_exam_id (PK integer) |
| student_redid (student FK) |
| exam_id (exam FK) |
| ... |
------------------------------
我正在使用的查询 select 可用的考试(使用 :redid 作为参数):
SELECT *
FROM exam ex
WHERE exam_id NOT IN (SELECT exam_id
FROM student_exam
WHERE student_redid = :redid)
ORDER BY ex.exam_id ASC,
ex.exam_date DESC
我需要通过验证可用考试是否与类似查询中的考试不冲突来改进此查询:
SELECT *
FROM student_exam
WHERE student_redid = :redid
好吧,我现在了解BETWEEN的使用,但不明白如何使用嵌套查询来验证时间范围。
如有任何帮助,我们将不胜感激。 谢谢!
- 首先你select这个学生还没有报名的所有考试
- 然后检查该考试是否与该学生已经注册的任何其他考试相冲突
.
SELECT *
FROM exam newEx
WHERE
NOT EXIST (SELECT se.exam_id
FROM student_exam se
WHERE
se.student_redid = :redid
AND se.exam_id = newEx.exam_id)
AND NOT EXIST (SELECT se.exam_id
FROM
student_exam se inner join
exam oldEx on se.exam_id = oldEx.exam_id
WHERE
student_redid = :redid
AND newEx.exam_start_time <= oldEx.exam_end_time
AND newEx.exam_end_time >= oldEx.exam_start_time
AND newEx.exam_date = oldEx.exam_date
)
ORDER BY
newEx.exam_id ASC,
newEx.exam_date DESC