2015-10-13 114 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年 –