我在MySQL中看到了很多关于日期范围的线程,但我似乎仍然找不到我想要的答案,所以任何帮助都会得到很大的帮助。
我有一个MySQL表,有3列,date-startTime-finishTime。日期是MySQL的"日期"类型字段,开始和结束时间都是"时间"类型字段。
比如说我在数据库中有一个条目,如下所示,让我们调用这个会话1;
date = 2011-06-30, startTime = 09:00:00, finishTime = 11:00:00
如果我来添加另一个会话,我需要确保它不会与现有会话冲突。因此,以下操作将失败,因为它位于会话1的开始和结束时间之间。
date = 2011-06-30, startTime = 10:00:00, finishTime = 12:00:00
因此,只能在现有会话中插入"AFTER"或"BEFORE"记录。
我使用的是PHP/MySQL,基于可以运行查询,如果有匹配的结果,则失败,如果没有匹配的结果则插入。
提前谢谢。
我使用的是PHP/MySQL,并且基于可以运行查询,如果有匹配的结果,则失败,如果没有匹配的结果则插入
好吧,试试这个。这里:date:
是要添加的条目的日期,:start-time:
和:finish-time:
分别是其开始和结束时间。
SELECT EXISTS (
SELECT
1
FROM
TableName
WHERE
`date` = :date: AND
( :start-time: BETWEEN startTime AND finishTime OR
:finish-time: BETWEEN startTime AND finishTime OR
startTime BETWEEN :start-time: AND :finish-time:
)
) AS `Clash`
我遇到了日期重叠检测的问题,我的第一个想法是做一些类似Hammerite的解决方案,但我发现这个解决方案不完整,主要是因为有太多可能的情况下两个日期范围会发生冲突:
我最终用来解决这个问题的查询是这样的:
/* overlapping dates */
SELECT *
FROM my_table
WHERE `date` = $date AND
NOT (
`start_time` < $start_time and `finish_time` < $start_time
OR
`start_time` > $end_time and `finish_time` > $end_time
)
有关更多详细信息,您可以在这里查看我的博客
我会用不同的方式构建表。我有两列,都是datetime
类型,分别命名为session_start
和session_end
。
逻辑是:如果是session_start
,则不能插入新会话。时间不是>
或<
,而不是旧会话session_end
。
假设$date、$startTime和$finishTime是分别存储要插入的日期、开始时间和结束时间的PHP变量。
$query = 'INSERT INTO `session`
SELECT '' . $date . '', '' . $startTime . '', '' . $finishTime . ''
FROM `session`
WHERE NOT EXISTS (SELECT *
FROM `session`
WHERE `date` = '' . $date . ''
AND '' . $startTime . '' BETWEEN `startTime` and `finishTime`
)';
希望这能有所帮助。
我会使用简单的:
INSERT INTO session
( `date`, startTime, finishTime )
SELECT
( $date, $startTime, $finishTime )
WHERE NOT EXISTS
( SELECT
*
FROM
session
WHERE
`date` = $date
AND $startTime < finishTime
AND startTime < $finishTime
)
如果希望两个周期09:00 - 11:00
和11:00 - 13:00
发生冲突,则应将<
更改为<=
。