1

我正在使用 codeignitor,我必须一次发布一个问题。对于每个问题,我都有一个发布日期、发布时间和结束日期、结束时间。因此,它就像“我们必须在 9 月 28 日晚上 9:00 到 10 月 2 日上午 11:00 发布问题 X”。开始和结束的日期和时间都存储在单独的列中。

因此,对于每个问题,我都有 4 列作为 publish_date、publish_time、end_date 和 end_time。

现在我想运行一个查询来检查数据库中是否有选定时间段的行,如果没有,我可以在该时间范围内创建一个新问题。我试过的问题是:

$query_check = $this->db->query("... (see query below) ...");

SQL查询如下:

SELECT question_id 
FROM questions 
WHERE 
(
    publish_date < '".$publish_date."' 
    AND 
    end_date > '".$publish_date."' 
    AND question_id NOT in (".$question_id.")
) 
OR 
(
    publish_date < '".$end_date."' 
    AND end_date > '".$end_date."' 
    AND question_id NOT in (".$question_id.")
) 
OR 
(
    publish_date > '".$publish_date."' 
    AND 
    publish_date < '".$end_date."' 
    AND 
    question_id NOT in (".$question_id.")
) 
OR 
(
    end_date > '".$publish_date."' 
    AND 
    end_date < '".$end_date."' 
    AND question_id NOT in (".$question_id.")
)  
OR 
(
    '".$publish_date."' = publish_date 
    AND 
    '".$publish_time."' >= publish_time 
    AND 
    '".$publish_time."' < end_time 
    AND question_id NOT in (".$question_id.")
) 
OR 
(
    '".$publish_date."' = end_date 
    AND 
    '".$publish_time."' < end_time 
    AND 
    '".$publish_time."' >= publish_time 
    AND question_id NOT in (".$question_id.")
) 
OR 
(
    '".$end_date."' = publish_date 
    AND 
    '".$end_time."' > publish_time 
    AND 
    '".$end_time."' <= end_time 
    AND 
    question_id NOT in (".$question_id.")
) 
OR
(
    '".$end_date."' = end_date 
    AND 
    '".$end_time."' <= end_time 
    AND 
    '".$end_time."' > publish_time 
    AND question_id NOT in (".$question_id.")
)

我错过了很多场景。就好像问题 A 是从 9 月 28 日下午 2:00 到 9 月 29 日下午 2:00 一样,我仍然可以在 9 月 27 日下午 2:00 到 9 月 29 日下午 3:00 的时间段内创建一个新的问题 B。这不应该发生,因为问题 A 出现在问题 B 的时间段内。因此,理想情况下,上述查询应该返回 0 行。

任何人都可以帮助我。任何想法或帮助都将受到高度评价

4

2 回答 2

1

您是否尝试过 BETWEEN 子句?

SELECT question_id FROM questions
where '".$publish_date."' BETWEEN publish_date AND end_date
AND '".$publish_time." BETWEEN publish_time AND end_time
于 2013-09-24T08:50:53.913 回答
1

我的理解是,您想检查由publish_datepublish_timeend_date和定义end_time的时间段是否与任何已经存在的问题的时间段重叠。

如果一个时间段在另一个时间段之前开始并在另一个时间段开始之后结束,则它与另一个时间段重叠。为了有效地执行此操作,您必须将所有日期和时间组合到日期时间。您可以简单地使用字符串连接,并且比较将正常工作。

SELECT question_id
FROM questions
WHERE '".$publish_date." ".$publish_time."' < CONCAT(end_date, ' ', end_time)
AND '".$end_date." ".$end_time."' > CONCAT(publish_date, ' ', publish_time)
'".$publish_date." ".$publish_time."' < CONCAT(end_date, ' ', end_time)
于 2013-09-24T19:40:36.483 回答