(我的)SQL解决方案,用于显示议程系统的可用时间段

时间:2013-02-09 16:52:22

标签: mysql database postgresql database-design

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

当然,我可以在PHP中执行此操作并轮询约会和可用性表,以查看每个显示日期的可用时间段,但有些时候听起来有点服务器密集。所以我想知道是否有办法生成一个mySQL结果关系,它显示了时隙和可用性调优....

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

约会 holds the appointments already made
id | int unique id
agenda_id | int unique id identifying the agenda
开始| date_time start of the appointment
结束| date_time end of the appointment
一些更具描述性的字段

可用性 when are there which time slots available
agenda_id | int identifying which agenda
day_of_the_week | int which day, eg 1=monday
start_time |时间e.g. 09:00:00 end_time |时间e.g. 11:00:00
time_slot | int how long are the time slots? e.g. 10minutes

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

期望的结果 给定日期2013-02-21和agenda_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 =不可用,预约存在

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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