0

描述 我正在制作一个带有(多个)议程的议程系统,您可以在其中预订一个可变时间段(10/15/20 或 30 分钟)在选定的时间段内(例如上午 9:00 到上午 11:00)周一和上午 10:30 至下午 3:00)

当然,我可以在 PHP 中执行此操作,并轮询约会和可用性表,以便为每个显示的每个日期提供可用的时间段,但有些听起来有点服务器密集型。所以我想知道是否有一种方法可以生成一个显示时隙和可用性元组的 mySQL 结果关系......

数据库/表设置 这是我认为必要的表设置。

约会 holds the appointments already made
ID | 整数unique id
议程_id | 诠释unique id identifying the agenda
开始 | 日期时间start of the appointment
结束 | date_timeend of the appointment
一些更具描述性的字段

可用性 when are there which time slots available
议程_id | int identifying which agenda
day_of_the_week | 整数which day, eg 1=monday
开始时间 | 结束时间 e.g. 09:00:00 | 时间e.g. 11:00:00
time_slot | 整数how long are the time slots? e.g. 10minutes

(备注:
如果需要time_slots字段也可以硬编码;
系统运行在MySQL数据库上,如果需要我们可以切换到postgresql

期望的结果 给定一个日期2013-02-21和一个议程 ID 1(如果需要,还有时间段15)和一个工作日,从 8:00 到 18:00;
如何创建 mysql 查询、视图或存储过程以生成下表/关系:

date       | 8:00 | 8:15 | 8:30 | 8:45 | 9:00 | 9:15 | ..... | 17:15 | 17:30 | 17:45 |
2013-02-21 |   0  |  0   |   0  |  0   |  1   |   2  | ..... |   2   |   2   |   1   |

其中:
0 = 不可预订
1 = 有空,您可以预订此时段
2 = 不可预订,已预约

4

2 回答 2

1

如果您决定切换到 PostgreSQL,您可能需要确保您使用的是 9.2 版(或更高版本),以便您可以充分利用范围类型排除约束。GiST 索引对此类数据非常有用,但排除约束会自动创建一个,因此您可能不需要显式声明一个。如果您想列出某个范围内的可用空缺时间,则可以使用generate_series函数将候选时间与现有计划相结合,NOT x && y以过滤掉不可用的时间。

我不确定 MySQL 中的等价物是什么。

于 2013-02-09T20:18:26.543 回答
0

您想要调整约会并与可用性进行比较。这是一个带有条件聚合的连接和聚合查询。以下是思路:

select agendaId, const.thedate,
       sum(case when thedate + interval 8 hour + interval 0 minute between ap.start and ap.end
                then 1 else 0
           end) as "8:00",
       sum(case when thedate + interval 8 hour + interval 15 minute between ap.start and ap.end
                then 1 else 0
           end) as "8:15",
       . . .
from (select date('2013-02-21' ) as thedate) const cross join
     Availability a left outer join
     Appointments ap
     on a.AgendaId = ap.AgendaId and
        const.day_of_the_week = weekday(const.thedate)        
where date(ap.start) = const.thedate 
group by AgendaId
于 2013-02-09T20:03:27.567 回答