SELECT中的SELECT?单个报告中的不同数据

时间:2016-02-15 00:48:17

标签: mysql

我的目标是生成一份报告,为我提供数据以提交给薪资公司。

我们的付款期是从1日到15日,然后是16日到月底,我可以轻松生成一份报告,显示员工在这些日期之间工作的小时数。

我的问题是加班。加班费是根据某一周的员工工作计算的。我们的周开始和结束日期是周日到周六。以下是挑战的具体示例。

2016-01-31结束的支付期是第3,4,5和6周的一部分。第4周和第5周有七天,第3周和第6周只有一天。我想支付(在此特定支付期间)员工在第3,4和5周工作的任何加班费。我将在下周支付期间为第6周加班支付费用。

我需要一些帮助。特别是开始寻找的方向。这会是我在SELECT中嵌入SELECT的情况吗?由于我在同一数据源上进行两次不同的旋转操作......我有点困惑。

任何人都有经验吗?想法?

Report for Pay Period Ending 2016-01-31

Employee                 Hours   OT Hr
----------------------- ------- -------
Joe Employee             95.00    1.00
   - Week 3 (1 Day)       7.00    1.00
   - Week 4 (7 Days)     40.00    0.00
   - Week 5 (7 Days)     40.00    0.00
   - Week 6 (1 Day)       8.00    0.00

此样本报告显示,在2016-01-31结束的支付期间,员工在16天内工作了96小时。加时赛的一小时和第3周的7小时常规时间表明,他们在上一个付费期间的工作时间增加了一个小时,这使得他们的第3周总时数超过40小时。

业务规则:员工加班时间为一周内超过40小时。周被定义为从星期日到星期六的时间。付款日期为付款日期。付款日期定义为每月的第15天和最后一天。如果支付期间发生在一周中。如上所述,员工在加薪日期的两个加班时间内获得报酬。

Sample Data as Requested

Employee        Start               End               Week  PayPeriod  Duration
John Employee   2016-01-02 09:23:42 2016-01-02 15:13:43 1   1/15/2016   5.83
John Employee   2016-01-04 09:42:30 2016-01-04 17:58:19 2   1/15/2016   8.26
John Employee   2016-01-05 09:46:04 2016-01-05 13:30:03 2   1/15/2016   3.73
John Employee   2016-01-05 14:03:02 2016-01-05 18:06:34 2   1/15/2016   4.06
John Employee   2016-01-06 10:30:43 2016-01-06 17:14:18 2   1/15/2016   6.73
John Employee   2016-01-07 10:05:22 2016-01-07 13:43:59 2   1/15/2016   3.64
John Employee   2016-01-07 14:14:20 2016-01-07 18:05:50 2   1/15/2016   3.86
John Employee   2016-01-08 09:55:59 2016-01-08 17:47:58 2   1/15/2016   7.87
John Employee   2016-01-11 10:28:22 2016-01-11 17:54:04 3   1/15/2016   7.43
John Employee   2016-01-12 09:33:30 2016-01-12 10:08:43 3   1/15/2016   0.59
John Employee   2016-01-12 10:39:59 2016-01-12 18:29:24 3   1/15/2016   7.82
John Employee   2016-01-13 10:41:16 2016-01-13 13:39:29 3   1/15/2016   2.97
John Employee   2016-01-13 13:39:29 2016-01-13 15:05:05 3   1/15/2016   1.43
John Employee   2016-01-13 15:05:06 2016-01-13 17:25:30 3   1/15/2016   2.34
John Employee   2016-01-14 10:32:28 2016-01-14 14:01:33 3   1/15/2016   3.48
John Employee   2016-01-14 14:20:47 2016-01-14 18:07:42 3   1/15/2016   3.78
John Employee   2016-01-15 09:40:31 2016-01-15 17:19:34 3   1/15/2016   7.65
John Employee   2016-01-16 09:40:31 2016-01-16 17:19:34 3   1/31/2016   7.65
John Employee   2016-01-18 10:01:39 2016-01-18 15:40:43 4   1/31/2016   5.65
John Employee   2016-01-18 15:53:38 2016-01-18 18:38:27 4   1/31/2016   2.75
John Employee   2016-01-19 10:43:24 2016-01-19 18:13:04 4   1/31/2016   7.49
John Employee   2016-01-20 10:38:38 2016-01-20 14:16:09 4   1/31/2016   3.63
John Employee   2016-01-20 14:16:09 2016-01-20 17:55:07 4   1/31/2016   3.65
John Employee   2016-01-21 10:39:31 2016-01-21 18:56:42 4   1/31/2016   8.29
John Employee   2016-01-22 10:57:55 2016-01-22 15:44:03 4   1/31/2016   4.77
John Employee   2016-01-22 15:57:54 2016-01-22 18:11:28 4   1/31/2016   2.23
John Employee   2016-01-25 10:08:57 2016-01-25 19:14:21 5   1/31/2016   9.09
John Employee   2016-01-26 10:45:35 2016-01-26 14:17:13 5   1/31/2016   3.53
John Employee   2016-01-26 14:40:51 2016-01-26 18:31:56 5   1/31/2016   3.85
John Employee   2016-01-27 09:53:33 2016-01-27 18:05:40 5   1/31/2016   8.20
John Employee   2016-01-28 10:36:57 2016-01-28 16:28:16 5   1/31/2016   5.86
John Employee   2016-01-28 16:43:20 2016-01-28 19:42:17 5   1/31/2016   2.98
John Employee   2016-01-31 10:00:40 2016-01-31 16:27:46 6   1/31/2016   6.45
John Employee   2016-02-01 10:45:42 2016-02-01 14:04:03 6   2/15/2016   3.31
John Employee   2016-02-01 14:15:06 2016-02-01 17:45:05 6   2/15/2016   3.50
John Employee   2016-02-01 17:45:05 2016-02-01 19:01:34 6   2/15/2016   1.27
John Employee   2016-02-02 11:03:49 2016-02-02 17:40:21 6   2/15/2016   6.61
John Employee   2016-02-03 11:08:06 2016-02-03 17:15:38 6   2/15/2016   6.13
John Employee   2016-02-04 11:20:59 2016-02-04 17:27:15 6   2/15/2016   6.10
John Employee   2016-02-04 17:27:15 2016-02-04 20:19:34 6   2/15/2016   2.87
John Employee   2016-02-05 10:47:57 2016-02-05 17:53:54 6   2/15/2016   7.10
John Employee   2016-02-08 10:51:45 2016-02-08 15:15:28 7   2/15/2016   4.40
John Employee   2016-02-08 15:34:52 2016-02-08 17:30:54 7   2/15/2016   1.93
John Employee   2016-02-09 11:01:09 2016-02-09 13:11:02 7   2/15/2016   2.16
John Employee   2016-02-09 13:11:02 2016-02-09 17:38:03 7   2/15/2016   4.45
John Employee   2016-02-09 17:38:03 2016-02-09 18:34:20 7   2/15/2016   0.94
John Employee   2016-02-10 10:43:39 2016-02-10 11:25:38 7   2/15/2016   0.70
John Employee   2016-02-10 11:25:38 2016-02-10 17:58:11 7   2/15/2016   6.54
John Employee   2016-02-11 10:16:30 2016-02-11 14:06:35 7   2/15/2016   3.83
John Employee   2016-02-11 14:30:17 2016-02-11 17:25:23 7   2/15/2016   2.92
John Employee   2016-02-12 10:46:50 2016-02-12 17:46:38 7   2/15/2016   7.00

我需要在PayPeriod 2016-01-15支付5.15小时的加班时间,因为他在2015-01-15付款期结束后才超过40小时。

如果员工在2016-01-15付款期结束前超过40小时,我需要在2016-01-15和2016-01-31付款期间支付加班时间为3小时

1 个答案:

答案 0 :(得分:0)

这是我对加班计算的看法:

  1. 你会开始检查这段时间的开始日期,那一天是什么时候?如果不是星期天,这意味着您需要为较早的日期支付一些加班费?好吧,多少天?你总是从那周的周日开始计算那一周的加班时间。这里一些有用的mySql函数是:DAYOFWEEK()和DATE_ADD()

  2. 然后你将继续直到达到/超过该期限的结束日期,并计算每周(周日至周六)的加班时间。如果星期六超过了工资核算期的结束日期,那么您只需跳过那一周的加班计算。