Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql (my)显示议程系统可用时间段的SQL唯一解决方案_Mysql_Database_Postgresql_Database Design - Fatal编程技术网

Mysql (my)显示议程系统可用时间段的SQL唯一解决方案

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 |

说明 我正在制作一个包含(多个)议程的议程系统,在该系统中,您可以在选定的时间段(如周一上午9:00至11:00,上午10:30至下午3:00)内预订可变时间(10/15/20或30分钟)的时段

当然,我可以在PHP中完成这项工作,并为显示的每个日期的每个可用时间段轮询约会和可用性表,但这听起来有点服务器密集。所以我想知道是否有一种方法可以生成一个mySQL结果关系,它显示时间段和可用性元组

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

预约
保留已预约的预约

id | int
唯一id

议程id | int
标识议程的唯一id

开始|日期_时间
约会开始

结束|日期_时间
约会结束

一些更具描述性的字段

可用性
什么时候有可用的时段

议程| id | int
识别哪个议程

一周的第几天,例如1=星期一 开始时间时间
例如09:00:00
结束时间时间
例如11:00:00

时隙| int
时隙有多长?e、 g.10分钟

(备注:
如有必要,也可以对时间槽字段进行硬编码;
系统运行在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=不可用,存在约会

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

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中的等价物是什么