在此方案中,我使用一個輔助表叫日期,看起來像這樣
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)
任何機會這功課? –
請參閱http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple-sql-查詢 – Strawberry