我认为这应该比我的头脑更容易处理它 - 但我已经盯着它看了太久......
我为客户提供数据库驱动的竞赛引擎。他们可以登录并上传奖品照片,问题,开始/结束日期等。
一切都很棒 - 除了他们现在正在改变系统以允许一次只运行一个比赛。 因此,当有人试图添加一个新的,我需要验证它不会与数据库中已有的任何其他比赛重叠......
我的脑袋设法让我这么远:
$db->query('SELECT
1
FROM
' . DB_T_PREFIX . 'competition
WHERE
(
start_date <= "'.$fldStartDate->getValue().'"
AND
close_date >= "'.$fldStartDate->getValue().'"
)
AND
deleted = "0000-00-00 00:00:00"');
有人可以检查我是否应该覆盖任何重叠? 我很确定我需要更多的条件来解决这个问题,但是头脑已变得糊涂了...讨厌使用日期范围。
谢谢,
史蒂夫
答案 0 :(得分:0)
绘画时间相关的东西通常很有帮助:
Timeline ( |------| is one competition; |.......| is "free" time)
Schedule:
...|-----------|.........|-------------------|......|--------|....>
X Y Z
You want to create a new Competition:
...................|-------------|................................>
NEW
正如您所看到的,这个时间框架与Y竞赛相交叉。为了找到每个交叉竞争,请在DB(伪代码)中检查:
SELECT 1 FROM x WHERE
start_date < new_start_date AND end_date > new start_date //intersect left
OR
start_date < new_end_date AND end_date > new_end_date //intersect right
答案 1 :(得分:0)
我写了一个调度应用程序,就像那样做了。我使用了以下查询:
$query = "SELECT ... WHERE ((a.start_time < '$start' AND a.end_time > '$start') OR (a.start_time > '$start' AND a.end_time < '$end')) AND i.user_id=$userId";
$start
是新活动的开始时间,$end
是新活动的结束时间。
另外,请确保将$start
和$end
格式化为'Y-m-d H:i:s'