描述 我正在制定一个具有(多个)议程的议程系统,您可以在选定的时间段(例如,上午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 =不可用,预约存在
答案 0 :(得分:1)
如果您决定切换到PostgreSQL,您可能希望确保使用的是9.2版(或更高版本),以便充分利用range types和exclusion 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