【问题标题】:MySQL / PHP Query - check that entered start/end dates don't overlap existing date ranges in DbMySQL / PHP 查询 - 检查输入的开始/结束日期是否与 Db 中的现有日期范围重叠
【发布时间】:2011-11-20 23:55:03
【问题描述】:

我认为这应该比我的大脑处理它更简单 - 但我已经盯着它太久了......

我有一个用于客户的数据库驱动的竞赛引擎。他们可以登录并上传奖品照片、问题、开始/结束日期等。

一切都很好 - 除了他们现在正在更改系统以允许一次只运行一场比赛。 因此,当有人尝试添加新的比赛时,我需要验证它不会与数据库中已有的任何其他比赛重叠......

我的脑袋已经让我走到这一步了:

$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"');

有人可以检查我这应该涵盖任何重叠吗? 我很确定我需要更多条件来解决这个问题,但头脑已经变得糊涂了......讨厌使用日期范围。

谢谢,

史蒂夫

【问题讨论】:

  • 之前有人回答过这个问题:stackoverflow.com/questions/2545947/…
  • 谢谢 - 不确定这是否是我需要的 100%。可能我的管理员用户可以按任何顺序添加这些比赛,并在数据库中现有条目之间的间隙中创建一个新的...
  • 在链接的答案中列出并证明了所有可能的对齐日期,它始终有效。但请注意,这与您拥有的解决方案不同。

标签: php mysql date range


【解决方案1】:

我曾经写过一个调度应用程序,它做了类似的事情。我使用了以下查询:

$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'

【讨论】:

    【解决方案2】:

    画时间相关的东西通常很有帮助:

    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
    

    【讨论】:

    • 这是不正确的,它没有解决所有的可能性。 Alexander 的链接提供了正确的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 2017-03-31
    • 1970-01-01
    • 2019-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多