查询时间范围

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