Mysql (my)显示议程系统可用时间段的SQL唯一解决方案
说明 我正在制作一个包含(多个)议程的议程系统,在该系统中,您可以在选定的时间段(如周一上午9:00至11:00,上午10:30至下午3:00)内预订可变时间(10/15/20或30分钟)的时段 当然,我可以在PHP中完成这项工作,并为显示的每个日期的每个可用时间段轮询约会和可用性表,但这听起来有点服务器密集。所以我想知道是否有一种方法可以生成一个mySQL结果关系,它显示时间段和可用性元组 数据库/表设置 这是我认为必要的桌子设置 预约Mysql (my)显示议程系统可用时间段的SQL唯一解决方案,mysql,database,postgresql,database-design,Mysql,Database,Postgresql,Database Design,说明 我正在制作一个包含(多个)议程的议程系统,在该系统中,您可以在选定的时间段(如周一上午9:00至11:00,上午10:30至下午3:00)内预订可变时间(10/15/20或30分钟)的时段 当然,我可以在PHP中完成这项工作,并为显示的每个日期的每个可用时间段轮询约会和可用性表,但这听起来有点服务器密集。所以我想知道是否有一种方法可以生成一个mySQL结果关系,它显示时间段和可用性元组 数据库/表设置 这是我认为必要的桌子设置 预约保留已预约的预约 id | int唯一id 议程id |
保留已预约的预约
id | int
唯一id
议程id | int
标识议程的唯一id
开始|日期_时间
约会开始
结束|日期_时间
约会结束
一些更具描述性的字段 可用性
什么时候有可用的时段
议程| id | int
识别哪个议程
一周的第几天,例如1=星期一 开始时间时间
例如09:00:00
结束时间时间例如11:00:00
时隙| int
时隙有多长?e、 g.10分钟
(备注:如有必要,也可以对时间槽字段进行硬编码;
系统运行在MySQL数据库上,如果需要,我们可以切换到postgresql
) 期望的结果 给出日期
2013-02-21
和议程id1
(如有必要,给出时间段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=不可用,存在约会您希望调整约会并与可用性进行比较。这是一个连接和聚合查询,带有条件聚合。以下是想法:
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
如果您决定切换到PostgreSQL,您可能希望确保您使用的是9.2版(或更高版本),以便充分利用和。GiST索引对于此类数据非常有用,但排除约束将自动创建一个索引,因此您可能不需要显式声明一个索引。如果要列出某个范围内的可用空缺,可以使用该功能将候选时间与现有计划合并,以筛选出不可用时间 我不确定MySQL中的等价物是什么