早上好,
我需要一个计算特定日期之间天数的解决方案。此外,我需要排除特定日期(公众假期和周末),这很容易,并且有大量关于如何执行此操作的说明。
但我还需要完成一件事。对于每个人,我也有自定义假期时间,我需要从之前的结果中减去它们。
目前,我有两张 table 。其中一个用于自定义假期期间:
+-----+----------+---------------------+---------------------+------+
| id | employee | start | end | away |
+-----+----------+---------------------+---------------------+------+
| 835 | 2.3 | 2016-12-05 00:00:00 | 2016-12-10 00:00:00 | P |
| 836 | 5.3.5.1 | 2017-01-03 00:00:00 | 2017-01-23 00:00:00 | P |
| 837 | 5.3.5.6 | 2016-12-21 00:00:00 | 2017-04-01 00:00:00 | P |
| 838 | 5.3.3.1 | 2017-01-01 00:00:00 | 2017-01-03 00:00:00 | P |
| 839 | 5.3.1.2 | 2017-01-03 00:00:00 | 2017-01-12 00:00:00 | P |
| 840 | 5.3.1.6 | 2017-01-01 00:00:00 | 2017-01-01 00:00:00 | P |
| 841 | 5.1.7 | 2017-01-09 00:00:00 | 2017-01-15 00:00:00 | P |
| 842 | 2.2 | 2017-02-16 00:00:00 | 2017-02-26 00:00:00 | P |
| 843 | 2.5 | 2017-07-31 00:00:00 | 2017-08-06 00:00:00 | P |
| 844 | 2.5 | 2017-08-21 00:00:00 | 2017-08-27 00:00:00 | P |
| 845 | 2.5 | 2017-06-26 00:00:00 | 2017-07-09 00:00:00 | P |
| 846 | 2.4 | 2017-04-04 00:00:00 | 2017-04-08 00:00:00 | P |
+-----+----------+---------------------+---------------------+------+
12 rows in set (0.00 sec)
我在开始和结束时显示日期和时间的原因是该表实际上还包含有关他们的工作时间表的信息。假期安排由“离开”列标记为“P”。
第二个表如下所示:
+-----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| date | varchar(45) | YES | | NULL | |
| dayofweek | varchar(45) | YES | | NULL | |
| short | varchar(45) | YES | | NULL | |
| holiday | varchar(45) | YES | | NULL | |
+-----------+-------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)
该表基本上是一个日历,其中包含有关星期几的附加信息(我知道这可以使用 dayofweek() 完成,但我也需要此列),“短”确定是否是缩短的工作日(必不可少计算时间时,因为一年中有几天工作日较短)和“假期”,标志着公共(public)假期。
我试图弄清楚如何通过减去公共(public)假期和周末(我可以做到并且相对容易)并减去自定义假期时间来计算一个月(2017年8月1日 - 2017年8月31日)的工作日。主要问题是,对于某些人来说,一个月内可能会出现不止一次缺勤的情况。
如果您查看上面的示例,员工 2.5 的假期从 7 月开始,到 8 月结束,我只需减去 8 月该期间的假期金额。员工 2.5 在 8 月还有另一个假期,我也需要减去这个假期。除此之外,该员工还有一个假期,从六月到七月。
完美的结果应该是这样的:
+----------+-------+---------------+--------------+---------------+
| employee | month | working hours | working days | vacation days |
+----------+-------+---------------+--------------+---------------+
我能想到的唯一解决方案是创建一个名为“假期”的新表,其中每天有一列,每行显示一名员工的数据。或者反过来,员工是列,行是日期。但在我知道没有更简单的方法之前,我不想开始尝试这个想法。
再一次,我确信 mysql 中有一个简单的函数可以做到这一点,但我无法弄清楚。
最佳答案
要计算工作时间,请执行以下操作:
$to_time = strtotime("$row[2]");
$from_time = strtotime("$row[3]");
$diff = $to_time - $from_time
echo round(abs($diff) / 3600,2). " hour(s)";
其中 $row[2] 和 $rows[3] 是您的开始日期和结束日期。/3600用于计算小时,只需写60而不是3600即可得到分钟。
对于工作日和假期,您可以使用 $diff 变量设置一个计数器并按天数递增并按假期递减。计算您喜欢的小时数或天数,然后按照您喜欢的方式增加/减少它。
关于mysql - 日期之间的差异(不包括自定义期间),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41218919/