Mysql SQL查询以选择数据库中谁的发布时间和结束时间不应重叠的行

Mysql SQL查询以选择数据库中谁的发布时间和结束时间不应重叠的行,mysql,sql,codeigniter,Mysql,Sql,Codeigniter,我正在使用Codeignator,我必须一次发布一个问题。对于每个问题,我都有一个发布日期、发布时间和结束日期、结束时间。因此,我们必须在9月28日晚上9:00到10月2日上午11:00发布问题X。开始和结束的日期和时间都存储在单独的列中 因此,对于每个问题,我有4个列作为发布日期、发布时间、结束日期和结束时间 现在,我想运行一个查询,检查数据库中是否有选定时间段的行,如果没有,我可以在该时间段上创建一个新问题。我试过的问题是: $query_check = $this->db->q

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

因此,对于每个问题,我有4个列作为发布日期、发布时间、结束日期和结束时间

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

$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,我仍然可以为时间段27日下午2:00到9月29日下午3:00创建新的问题B。当问题A出现在问题B的时间段内时,不应出现这种情况。因此,理想情况下,上述查询应返回0行


有人能帮我吗。任何想法或帮助都将受到高度赞赏

您是否尝试过中间条款

SELECT question_id FROM questions
where '".$publish_date."' BETWEEN publish_date AND end_date
AND '".$publish_time." BETWEEN publish_time AND end_time

我的理解是,您希望检查由publish_date、publish_time、end_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)

使用between可以减少查询的次数。您可以发布示例数据或创建SQL FIDLE吗?我想您需要检查一下,从9月28日上午11点开始到9月29日上午10点结束的时间段如何?由于“11:00:00”和“10:00:00”之间的“.publish_time.”对于publish_time的所有值都为FALSE,因此将永远不会选择此类行。