php – 计算日期范围的设备总数
项目:我正在开展一个关于房间里使用的房间和设备的项目.该软件是关于调度房间内的设备.换句话说,它是一个预订软件,可以在所需的日期和时间范围内为不同的房间预留选定的设备.我在MYsSQL数据库中有很多与Php一起工作的表,但我会提到我的问题所在的表.我将与我的问题相关的表格是设备表(表A),时间表(表B)和在相关时间表中使用的设备(表C).
表A:设备清单表 eqid | eqName | available| 1 | book | 90 | 2 | pen | 82 | 3 | computer | 25 | 在表A中; eqid表示设备的唯一ID,eqName表示设备的名称,可用表示现有的可用设备总数. 表B:计划表 scheduleid | startDate | endDate | startTime | endTime | office | 1 | 2012-08-27 | 2012-08-27 | 08:30:00 | 10:00:00 | room1 | 2 | 2012-08-27 | 2012-08-27 | 09:30:00 | 11:00:00 | room3 | 3 | 2012-08-28 | 2012-08-30 | 08:30:00 | 12:00:00 | room2 | 4 | 2012-08-29 | 2012-08-31 | 11:30:00 | 14:00:00 | room1 | 5 | 2012-08-28 | 2012-08-28 | 10:30:00 | 14:00:00 | room3 | 6 | 2012-08-27 | 2012-08-30 | 08:30:00 | 10:00:00 | room4 | 7 | 2012-08-27 | 2012-08-27 | 10:30:00 | 12:00:00 | room4 | 8 | 2012-08-27 | 2012-08-30 | 08:30:00 | 11:00:00 | room6 | 9 | 2012-08-27 | 2012-08-27 | 10:30:00 | 12:00:00 | room5 | 在表B中; scheduleid表示计划的唯一ID,startDate和endDate是计划的日期范围,计划的startTime和endTime时间范围,office表示计划将在何处进行.让我举一个例子. Scheduleid 1表示2012年8月27日星期一有一个预订,时间是08:30到10:00.因为它在同一天开始和结束,这只是在room1预订一天.但是,Scheduleid 3意味着预订将于2012年8月28日星期二开始,并持续到2012年8月30日,星期四08:30-12:00 ……换句话说,它将持续3天,每天从08:30至12:00 …所以在2号房间的周二至周四08:30至12:00预订…我希望这一点很清楚. 表C:在相关时间表中使用的设备 Autoid | scheduleid | eqid | amountInSch| 1 | 1 | 1 | 2 | 2 | 1 | 2 | 3 | 3 | 1 | 3 | 1 | 4 | 2 | 1 | 1 | 5 | 2 | 2 | 1 | 6 | 2 | 3 | 2 | 7 | 3 | 2 | 1 | 8 | 3 | 3 | 3 | 9 | 4 | 2 | 1 | 10 | 4 | 3 | 1 | 11 | 5 | 1 | 1 | 12 | 6 | 1 | 1 | 13 | 6 | 3 | 2 | 14 | 6 | 2 | 4 | 15 | 7 | 1 | 5 | 16 | 7 | 2 | 6 | 17 | 8 | 2 | 1 | 18 | 9 | 1 | 8 | 19 | 9 | 2 | 5 | 20 | 9 | 3 | 6 | 在表C中:Autoid表示由自动增量生成的唯一自动id,scheduleid来自表B,eqid来自表A,amountInSch表示将在相关时间表中使用多少(数量)设备.我想在这里举个例子.表C中的Scheduleid 1有3行.这意味着在TAble B中相关的scheduleid 1将在表B中的room1指定日期和时间使用2本书(eqid 1),3本笔(eqid 2)和1台计算机(eqid 3).另一个例子是表C中的scheduleid 3与2行相关.这意味着1笔(eqId 2)和3台电脑(eqId 3)将于2012年8月27日至30日从08:30至12:00在room2使用. 以上是解释并提供有关该项目的一些信息.表行不是永久性的.当您进行预订时,表B中将有一个新行,如果选择了一个设备,表C中将有新行… 问题: 当我提供eqId,startDate,endDate,startTime和endTime时,我想计算特定设备的剩余量… 一个例子: eqId:1(书) startDate:2012-08-27 endDate:2012-08-27 startTime:08:30:00 结束时间:12:00:00 结果应该是:计划中使用的14本书和剩余的76本书 因为:如果您查看scheduleIds和相关的eqIds,您将只看到与我的查询相关的1,2,6,7,9个scheduleIds(日期和eqId).如果将表C中所有相关数量相加,则会得到错误的结果.换句话说,eqId(1-book)和1,9 scheduleIds的相关量分别为2,1,5,8.因此,如果你总结它们,你会得到17这是错误的.因为,1和9计划在开始和结束时间方面彼此不相交,并且6和7也不相互交叉.由于他们2保持孤独,可以分开计算.我们必须考虑1和9作为总和8因为8大于2.对于6和7是相同的,因为5大于1所以认为是5 … 大家好!我不确定如何在编程算法中求和/这个.有没有办法在SQL中做或者我必须一起使用PHP和Mysql?如何? 干杯! SQLFiddle Records
我从以下SQL开始,收集与给定范围相交的所有日期范围:
SELECT MAX(available) - IFNULL(SUM(amountInSch),0) FROM Table1 LEFT JOIN Table3 USING (eqid) LEFT JOIN Table2 USING (scheduleid) WHERE DATE(startDate) <= '2012-08-27' AND DATE(endDate) >= '2012-08-27' AND endTime > '08:30' AND startTime < '12:00' AND eqid = 1 Fiddle 这只是第一部分.接下来你必须找出可能的重叠;这对SQL来说是不切实际的,所以我建议在PHP中这样做. 不幸的是,我会选择通用算法O(n ** 2),它是这样的: >以时间为横轴创建时间轴(按每天划分) 希望有所帮助. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |