【问题标题】:find space in a mysql database calendar for new appointment在 mysql 数据库日历中查找新约会的空间
【发布时间】:2016-02-17 22:22:00
【问题描述】:

完全迷失在这里。我有一个带有约会表的 mysql 数据库。重要的是它有一个 start_date 和 end_date

假设我需要找到下一个可用的 30 分钟时段。需要统计周一至周五和早上 7 点到晚上 7 点

基本上我需要一种方法来自动执行此过程。我的 sql 查询会是什么样子?

select * from calendar where end_date

【问题讨论】:

  • 您应该考虑另一种解决方法,而不是处理日期。从早上 7 点到晚上 7 点,您有 12 个小时,并且有 30 分钟的时间段 - 24 个时间段。如果您使用某种位掩码来表示哪些插槽可用或不可用,则可以简化查询和问题。
  • 我会获取所有未来的约会并在 php 循环中搜索下一个位置。我试图在SQL 中这样做,但由于复杂性的增加而停止了。虽然它仍然是可能的 - 它几乎无法维护。
  • 一个恰当的例子将有助于澄清问题
  • Landen - 是的,我相信你是对的。我需要在 PHP 中的 SQL 之外考虑这个问题。仍然没有 100% 掌握这个想法,但我当然无法用 SQL 解决它。谢谢大家
  • 可能想检查这个类似的问题:stackoverflow.com/questions/13414795/…

标签: php mysql


【解决方案1】:

考虑到我不精通 SQL,但我只是试图解决问题。这样的事情可以解决问题吗?

SELECT *, TIMEDIFF(end_date, start_date) as time_diff FROM calendar WHERE  start_date > NOW() AND (TIME_TO_SEC(TIMEDIFF(end_date, start_date)) / 60) > 30;

如果您添加ORDER BY start_dateLIMIT 1,您将获得第一个匹配项。

【讨论】:

    【解决方案2】:

    如果您不担心预约表中的“空”时段,您可以设置一个程序,定期将时段预分配到“预订期限”(例如下个月底)并删除过去的“空”槽。

    create table `appointment` (
        `slot`   varchar (90),
        `remarks` varchar (180)
    ); 
    insert into `appointment` (`slot`, `remarks`) values('2016-03-01 08:00','');
    insert into `appointment` (`slot`, `remarks`) values('2016-03-01 09:00','');
    insert into `appointment` (`slot`, `remarks`) values('2016-03-01 10:00','');
    insert into `appointment` (`slot`, `remarks`) values('2016-03-01 11:00','Tennis with Mark');
    insert into `appointment` (`slot`, `remarks`) values('2016-03-01 12:00','Lunch at home');
    insert into `appointment` (`slot`, `remarks`) values('2016-03-01 13:00','Programming');
    insert into `appointment` (`slot`, `remarks`) values('2016-03-01 14:00','');
    insert into `appointment` (`slot`, `remarks`) values('2016-03-01 15:00','');
    insert into `appointment` (`slot`, `remarks`) values('2016-03-01 16:00','');
    insert into `appointment` (`slot`, `remarks`) values('2016-03-01 17:00','');
    ...
    ...
    delete from `appointment` where slot < '2016-02-01' and remarks='';
    

    示例中查找第一个约会的查询很简单:

    select * from `appointment` where `slot` > '2016-03-01' and `remarks` = ''
    

    但您可以创建更复杂的搜索模式:

    select * from `appointment` 
    where left(`slot`,10) between '2016-03-01'  and '2016-03-01'
    and right(`slot`,5) between '15:00' and '17:00'
    and `remarks` = ''
    

    【讨论】:

      【解决方案3】:

      这不是一个技术性的答案,只是因为这个问题不是技术性的,而是合乎逻辑的。前段时间我遇到了同样的情况,我很快意识到搜索整个约会表简直是极端的,因为表的大小不断增加,而且它需要的资源。 另外,我必须处理各种时间间隔,例如有 10 分钟的约会、5 分钟的约会和 15 分钟的约会。

      因此,我从逻辑上接近了这个问题,并得出了以下解决方案:

      • 我使用 5 分钟间隔作为测量单位
      • 我将指定医生每小时的间隔划分为 5 分钟并记住了该结果(例如一天有 40 个间隔)
      • 每次预约或取消时,我都会检查当天剩余的时间间隔。例如,当创建约会时,我将该约会所需的时间间隔添加到当天已占用的其余时间间隔中,然后提取取消约会的时间。
      • 每当一天被填满,或者剩余的时间间隔太少而无法预约时,我将这一天标记为已满
      • 当我需要知道第一个可用的预约时,我只需检查第一天是否未满

      这样,数据库的工作是相同的,因为它每次都有相同的工作负载。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-11
        • 2017-08-17
        • 2015-10-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多