2015-10-13 122 views
2

您好,我将如何去计算一天内从员工开始日期开始计算的日子假日,然后每隔一个连续的日子。从开始日期开始计算每年的节假日然后每年

Table 1 

id name lastname  startdate  holidays 

1 jon  homes  2014-10-10  25 

假期表将不得不采取

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个月形成的员工开始,然后日期每年都这样做,将来没有硬编码的日期。

我可以了解如何在本年度为此

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

那么如何运行从开始日期查询2014年10月为12个月,然后每年(下一次启动日期为2015年10月10日则2016年10月10日等)

感谢

回答

0

你需要考虑这个查询的一些数学。为了达到这个目的,我将在你的日期holiday_date - emp_startdate中取出差值,并将其除以result/365年的天数,最后使用CEIL进行取整。

我也将使用JOINGROUP BY以这种方式:

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 

结果:

+----------+------+---------------+ 
| Employee | Year | Holidays_Taken| 
+----------+------+---------------+ 
| Jon  | 1 | 5    | 
+----------+------+---------------+ 
| Jon  | 2 | 1    | 
+----------+------+---------------+ 

DEMO:SQL FIDDLE

+0

好的我有问题了,如果您在2015年12月30日在2016-1-1的当前年份更改以及2015年10月10日至2016年的日期之间运行查询, 10-10年已经结束2015年和2016年我已经在[sqlfiddle](http://www.sqlfiddle.com/#!9/2b418/5)上设置了一个演示,我会在你的解决方案上采取行动,谢谢 –

+0

我明白了。先看看我的小提琴。并告诉我你的想法 – CodeGodie

+0

欢呼的小提琴演示,你可以在小提琴演示中看到的评论我做了我的表作为在那一天采取的小时数如何计算他们而不是日期? [DEMO](http://www.sqlfiddle.com/#!9/2b418/5)谢谢 –

0

只需使用一个BETWEEN条款:

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

动态方式:

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。

+0

这取决于,你用PHP?是应该是一个存储过程?你是否使用'DATE_ADD(date,INTERVAL 1 YEAR)' – ThinkTank

+0

编辑:它不是年份+ 1,但是年份-1。你不能得到1年,因为它不存在^^ – ThinkTank

+0

不知道你的意思:不是年份+ 1但年-1我想查询动态的方式? INTERVAL - 1年 –