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进行四舍五入。
我也会以这种方式使用JOIN和GROUP 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
-
好的,我有问题克服这个事实,如果你在2015-12-30运行查询2016-1-1当前年度的变化和2015-10-10到2016-10-10之间的日期结束2015年和2016年我已经在sqlfiddle上设置了一个演示,我将采取你的解决方案,谢谢你
-
我知道了。先看看我的小提琴。并告诉我你的想法
-
欢呼声为小提琴演示,你可以在评论的小提琴演示中看到我把我的桌子作为当天的小时数我怎么算他们而不是天?演示谢谢
-
什么?我现在很困惑。您在原始问题中没有提及有关hours的任何内容。小时与开始日期有何不同?请提供详细说明,如果与初始问题有太大不同,请打开另一个问题,以便我们跟进。
-
这是你的意思:sqlfiddle.com/#!9 / d5bc3 / 5?
-
抱歉时间,但我专注于年份和日期你的演示时间很棒。在今年的一年而不是一年的另一件事是我如何格式化它所以它说2014-10-10到2015-10-10(第1年)2015-10-10到2016-10-10(第2年) )这可能在查询中?再次感谢!!
-
很高兴我能帮助你。我相信它可以用CONCAT来完成。我建议为这个问题开辟一个新问题。然后将我链接到它,以便我可以继续帮助。
-
如何在新问题中链接您链接问题谢谢
-
闰年2016年下一个366天呢?
-
我如何得到al用户假期组多年是这可能FIDDLE演示2用户1和18(我有18个用户在一起)谢谢
只需使用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开始。
-
这取决于你使用PHP吗?是应该是一个存储过程?你喜欢使用DATE_ADD(date, INTERVAL 1 YEAR) 吗?
-
编辑:它不是年+ 1而是年-1。你不能获得+1年,因为它还不存在^^
-
不确定你的意思:不是年+ 1而是年-1我想以动态的方式进行查询?间隔 - 1年
-
感谢您的响应只是运行您的动态查询我已经设置了演示DEMO,因为您可以看到它拉日期2014-10-24