2017-01-08 109 views
0

比方說計算員工總工資?

工作人員從2016-12-31 23:30 PM2017-01-01 06:30 AM

在這裏,我需要從下面的規則計算員工的工資總額率:

Rule# | Date  | StartTime | EndTime | WageRate(HR)  
1  | 2016-12-31 | 07:00  | 23:59 | 25 
2  | 2017-01-01 | 00:00  | 06:00 | 40 
3  | 2017-01-01 | 06:00  | 11:30 | 30 

最終的結果應該考慮以下步驟:

On 2016-12-31 
23:30 - 23:59 = 29 min of wage 

這應該是從規則#1,因爲工作時間在07:00 - 23:59之間。

同樣,

On 2017-01-01 
00:00 - 06:00 = 6 HR wage 

這應該是從規則#2

06:00 - 06:30= 30 min wage 

這應該是從規則#3

我試圖通過增加開始一小時的工作時間,但它在規則#1和規則#2的情況下失敗。

+1

任何機會這功課? –

+0

請參閱http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple-sql-查詢 – Strawberry

回答

0

在此方案中,我使用一個輔助表叫日期,看起來像這樣

MariaDB [sandbox]> select dte from dates where dte between '2016-12-31' and '2017-01-01'; 
+------------+ 
| dte  | 
+------------+ 
| 2016-12-31 | 
| 2017-01-01 | 
+------------+ 
2 rows in set (0.02 sec) 

因此,考慮

drop table if exists WageRate; 
create table WageRate (Rule int , Dte date, StartTime time, EndTime time, WageRate int);  
insert into wagerate values 
(1 ,  '2016-12-31' ,'07:00'  , '23:59' , 25), 
(2 ,  '2017-01-01' ,'00:00'  , '06:00' , 40), 
(3 ,  '2017-01-01' ,'06:00'  , '11:30' , 30); 

drop table if exists EmployeeHours; 
create table EmployeeHours (id int, startdatetime datetime, enddatetime datetime); 
truncate table employeehours; 
insert into EmployeeHours values 
(1,'2016-12-31 23:30:00' , '2017-01-01 06:30:00'), 
(2,'2016-12-31 23:30:00' , '2017-01-01 06:00:00'); 

這個查詢

select s.*, 
     timediff(s.newet,s.newst) TimeDifference 
from 
(
select eh.*,d.dte d_dte,wr.*, 
     case when cast(concat(wr.dte,' ',wr.starttime) as datetime) >= eh.startdatetime then 
       cast(concat(wr.dte,' ',wr.starttime) as datetime) 
       else eh.startdatetime 
     end as newst, 
     case when cast(concat(wr.dte,' ',wr.endtime) as datetime) <= eh.enddatetime then 
       cast(concat(wr.dte,' ',wr.endtime) as datetime) 
       else eh.enddatetime 
     end as newet 
from EmployeeHours eh, dates d 
join WageRate wr on wr.dte = d.dte 
where d.dte between '2016-12-31' and '2017-01-01' 
) s 
where timediff(s.newet,s.newst) <> 0 

返回

------+---------------------+---------------------+------------+------+------------+-----------+----------+----------+---------------------+---------------------+----------------+ 
| id | startdatetime  | enddatetime   | d_dte  | Rule | Dte  | StartTime | EndTime | WageRate | newst    | newet    | TimeDifference | 
+------+---------------------+---------------------+------------+------+------------+-----------+----------+----------+---------------------+---------------------+----------------+ 
| 1 | 2016-12-31 23:30:00 | 2017-01-01 06:30:00 | 2016-12-31 | 1 | 2016-12-31 | 07:00:00 | 23:59:00 |  25 | 2016-12-31 23:30:00 | 2016-12-31 23:59:00 | 00:29:00  | 
| 2 | 2016-12-31 23:30:00 | 2017-01-01 06:00:00 | 2016-12-31 | 1 | 2016-12-31 | 07:00:00 | 23:59:00 |  25 | 2016-12-31 23:30:00 | 2016-12-31 23:59:00 | 00:29:00  | 
| 1 | 2016-12-31 23:30:00 | 2017-01-01 06:30:00 | 2017-01-01 | 2 | 2017-01-01 | 00:00:00 | 06:00:00 |  40 | 2017-01-01 00:00:00 | 2017-01-01 06:00:00 | 06:00:00  | 
| 2 | 2016-12-31 23:30:00 | 2017-01-01 06:00:00 | 2017-01-01 | 2 | 2017-01-01 | 00:00:00 | 06:00:00 |  40 | 2017-01-01 00:00:00 | 2017-01-01 06:00:00 | 06:00:00  | 
| 1 | 2016-12-31 23:30:00 | 2017-01-01 06:30:00 | 2017-01-01 | 3 | 2017-01-01 | 06:00:00 | 11:30:00 |  30 | 2017-01-01 06:00:00 | 2017-01-01 06:30:00 | 00:30:00  | 
+------+---------------------+---------------------+------------+------+------------+-----------+----------+----------+---------------------+---------------------+----------------+ 
5 rows in set (0.05 sec) 
+0

你可以在沒有幫助表的情況下解決嗎? – Strawberry

+0

@Strawberry是。 –