2017-05-29 34 views
0

This are the logs of employee # 16計算/確定小時夜班與多個日誌

And here is my expected output

我已經試過此查詢:

SELECT a.`id` AS employ_id, 
     ADDTIME(MIN(a.adjustedDateTime), '12:00:00') AS check_in_time, 
     ADDTIME(MAX(a.adjustedDateTime), '12:00:00') AS check_out_time, 
    TIMEDIFF(
     MAX(a.adjustedDateTime), 
     MIN(a.adjustedDateTime) ) AS working_time, 
     COUNT(0) AS report_times, 
    DATE_FORMAT(a.adjustedDateTime, '%Y-%m-%d') AS report_date 
FROM (SELECT 
    `EnNo` AS id, 
    SUBTIME(
     CONCAT(DATE(DateTime), ' ', TIME(DateTime)), '12:00:00') AS adjustedDateTime 
     FROM 
    bio) a 
    GROUP BY a.`id`, 
    DATE_FORMAT(a.adjustedDateTime, '%Y-%m-%d') 
     ORDER BY a.`id`, DATE('DateTime'); 

[這裏是輸出,不計算dayshift小時:

--- Empid - | ---------- TimeIn ---------- | ---------- TimeOut ------- | --------- - 小時----- |

00000006 2017-05-15 18:14:13 2017-05-16 06:30:05 12:15:52.000000 
00000006 2017-05-16 18:10:18 2017-05-17 05:30:50 11:20:32.000000 
00000006 2017-05-18 08:30:05 2017-05-18 08:30:05 00:00:00.000000 
00000006 2017-05-18 15:30:05 2017-05-18 15:30:05 00:00:00.000000 

誰能幫助我?或任何有關它的算法或任何建議。謝謝。很抱歉,如果我不能發佈的圖像,沒有足夠的信譽:(

+0

從業務角度來看,「夜班時間」會是什​​麼?什麼時候開始,什麼時候結束?你可以給你的工作日誌表定義表格嗎? – Jan

+0

我的夜班定義是晚上10點。我只是需要獲得幫助,以獲得工作時間的空檔和夜班。就像上面給出的一樣。我需要幫助:3 – Nicoooooo

+0

您對上班時間的計算似乎也是如此。看起來第3行和第4行從08:30到15:30將是一天移位? – Jan

回答

0

基本上你有以下:

  • 一個SQL statemeng給予開始和結束時間的任何變化,可能已經是一個夜班,
  • 時差計算。

現在,什麼是夜班?

  • 全部爲H晚上10點
  • 在結束爲期一天早上7點之前發生的一切小時後發生在啓動日我們

所以(在我的部分猜測),而不是簡單地用「工作的啓動」時間戳,您使用在工作開始和晚上10點之間以及工作結束和上午7點之間的最小值:

請注意,我必須添加一些條件來猜測哪些是可能的工作結束時間(中午之前)​​以及哪些是這個夜班計算的一個可能的開始工作時間(中午之後):

create table worktime_stackoverflow (id int, DateTime datetime); 
delete from worktime_stackoverflow where id > 0; 
insert into worktime_stackoverflow values (1, '2017-05-15 18:14:13'); 
insert into worktime_stackoverflow values (2, '2017-05-16 06:30:05'); 
insert into worktime_stackoverflow values (3, '2017-05-17 22:30:45'); 
insert into worktime_stackoverflow values (4, '2017-05-18 09:30:05'); 
insert into worktime_stackoverflow values (5, '2017-05-20 10:45:15'); 
insert into worktime_stackoverflow values (6, '2017-05-20 19:31:25'); 
insert into worktime_stackoverflow values (5, '2017-05-21 16:45:15'); 
insert into worktime_stackoverflow values (6, '2017-05-22 03:17:25'); 


select DATE(w.DateTime) day_of_report 
    # Start of nightshift 
, CONCAT(DATE(MIN(w.DateTime)), ' ' , '22:00:00') start_nightshift, 
    # actual start of work 
     MIN(w.DateTime) start_of_work, 
    # mathematical max() of the two 
     GREATEST(
      CONCAT(DATE(MIN(w.DateTime)), ' ' , '22:00:00'), 
      Min(w.DateTime) 
     ) nightshift_work_start, 
    # end of nightshift-hours 
     CONCAT(ADDDATE(DATE(MIN(w.DateTime)), INTERVAL 1 DAY), ' ' , '07:00:00') end_nightshift 
    # the following worklog entry (= end of work) 
     ,(SELECT MIN(w2.DateTime) as following_time FROM worktime_stackoverflow w2 WHERE w2.DateTime > w.DateTime AND TIME(w2.DateTime) < '12:00:00' 
        AND DATEDIFF(w2.DateTime, w.DateTime) < 2) as end_of_work 
    # mathematical minimum of these two 
     ,LEAST(
      (SELECT MIN(w2.DateTime) as following_time FROM worktime_stackoverflow w2 WHERE w2.DateTime > w.DateTime AND TIME(w2.DateTime) < '12:00:00' 
       AND DATEDIFF(w2.DateTime, w.DateTime) < 2), 
      CONCAT(ADDDATE(DATE(MIN(w.DateTime)), INTERVAL 1 DAY), ' ' , '07:00:00') 
     ) nightshift_work_end 
from worktime_stackoverflow w 
    # make sure to not use end-of-nightshift loutout times 
    where TIME(w.DateTime) > '12:00:00' 
GROUP by DATE(w.DateTime); 

對於最終解決方案,您必須添加員工ID等等......

+0

這會幫助很多。那些日子呢?假設從上午9點到下午5點。 – Nicoooooo

+0

你說你有那些......那些只是那些在同一天有最小和最大值而不相等的,對吧? – Jan

+0

是的,我願意。但是在我查詢的哪一部分我會插入它?我會將我的查詢添加到您的天移。(DateTime),MIN(DateTime)FROM bio GROUP BY DATE('DateTime'),EmpNo; – Nicoooooo