PHP   发布时间:2022-04-09  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了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中做或者我必须一起使用PHPMysqL?如何?

干杯!

@L_675_25@

我从以下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),它是这样的

>以时间为横轴创建时间轴(按每天划分)
>迭代每个日期/时间范围并标记其左右边缘的时间,以创建每个可能排列的时间段.
>使用细分,您可以垂直求和重叠,并获取每日最大值.

希望有所帮助.

大佬总结

以上是大佬教程为你收集整理的php – 计算日期范围的设备总数全部内容,希望文章能够帮你解决php – 计算日期范围的设备总数所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。