关于php:计算从开始日期到一年的假日天数

Count holiday days from start date for a year then every year

我如何计算从员工开始日期开始计算的一年内的假日,然后是连续的每一天。

1
2
3
4
5
Table 1

id  name    lastname     startdate      holidays

1    jon     homes        2014-10-10      25

假期表将采取所有假期

1
2
3
4
5
6
7
8
id   empid   date

1       1    2014-12-20
2       1    2014-12-21
3       1    2014-12-22
4       1    2015-10-01
5       1    2015-10-02
6       1    2015-10-11 (this would be a new year)

如何从员工开始日期开始查询mysql以计算12个月的假期,然后在将来每年执行此操作而无需对日期进行硬编码。

我可以理解今年如何做到这一点

1
2
3
SELECT COUNT(*)
 FROM Holiday
 WHERE YEAR(date) = YEAR(CURDATE()) AND empid = 1;

那么我如何从startdate 2014-10-10运行查询12个月然后每年(下次开始日期将是2015-10-10然后2016-10-10等)

谢谢


您需要考虑此查询的一些数学。 为了实现这个目的,我将在你的日期holiday_date - emp_startdate中取出差异并将其除以一年中的天数result/365,最后使用CEIL进行四舍五入。

我也会以这种方式使用JOINGROUP BY

1
2
3
4
5
6
7
8
SELECT
    e.name AS Employee,
    CEIL(DATEDIFF(h.date, e.startdate)/365) as Year,
    count(h.date) as Holidays_Taken
FROM employees AS e
LEFT JOIN holidays_taken AS h ON e.id = h.empid
WHERE e.id = 1
GROUP BY Year

结果:

1
2
3
4
5
6
7
+----------+------+---------------+
| Employee | Year | Holidays_Taken|
+----------+------+---------------+
| Jon      | 1    | 5             |
+----------+------+---------------+
| Jon      | 2    | 1             |
+----------+------+---------------+

演示:SQL FIDDLE


只需使用BETWEEN子句:

1
2
3
SELECT COUNT(*)
 FROM Holiday
 WHERE date BETWEEN '2015-10-10' AND '2016-10-10' AND empid = 1;

动态方式:

1
2
3
4
SELECT *
FROM Holidays
WHERE date BETWEEN DATE_SUB(CONCAT(YEAR(CURDATE()), '-10-10'), INTERVAL 1 YEAR) AND CONCAT(YEAR(CURDATE()), '-10-10')
AND empid = 1;

编辑:相反,你必须从-1开始。