2014-02-13 27 views
1
id  staff_ID  STAFFNAME    CARDTIME 
39618 1203024  BARAYUGA M.  2014-02-03 08:44:02 
39618 1203024  BARAYUGA M.  2014-02-03 12:20:02 
39618 1203024  BARAYUGA M.  2014-02-03 12:50:49 
39618 1203024  BARAYUGA M.  2014-02-03 17:33:44 
39622 1203056  LEONES M.  2014-02-03 12:00:21 
39622 1203056  LEONES M.  2014-02-03 12:23:19 
39622 1203056  LEONES M.  2014-02-03 13:22:33 
39622 1203056  LEONES M.  2014-02-03 15:30:11 

以上是我的表tbl_staff在我的數據庫中,有沒有一種方法可以獲得每位員工的總休息時間?僅使用Mysql查詢。如何獲得只使用MySQL Query的員工的休息時間

這是我現在正在使用的示例查詢。

SELECT 
    DATE, 
    STAFFNAME, 
    LOGIN, LOGOUT, 
    SUCCESSFUL, 
    TIME, 
    NUMBEROFTIME, 
    FIND_IN_SET(LOGIN,TIME), 
    FIND_IN_SET(LOGOUT,TIME) 
FROM 
(
    SELECT 
     DATE(CARDTIME) AS DATE, 
     STAFFNAME, 
     MIN(CARDTIME) AS LOGIN, 
     MAX(cardtime) AS LOGOUT, 
     CASE 
     WHEN COUNT(CARDTIME) %2 =0 THEN 1 
     ELSE 0 
     END AS 'SUCCESSFUL', 
     GROUP_CONCAT(DISTINCT(CARDTIME) ORDER BY (CARDTIME)) AS TIME, 
     COUNT(CARDTIME) as NUMBEROFTIME 
    FROM tbl_staff 
    GROUP BY STAFFNAME, DATE(CARDTIME) 
) AS x 

我已經研究如何獲得休息時間,但示例數據是否有出入那裏沒有LOGINLOGOUT

在此先感謝您的幫助。

回答

1

MySQL允許你寫這樣的查詢:

SELECT 
    id, staff_ID, STAFFNAME, 
    timediff(t3,t2) AS Break 
FROM (
    SELECT 
    id, staff_ID, STAFFNAME, 
    DATE(CARDTIME) as carddate, 
    SUBSTRING_INDEX(
     SUBSTRING_INDEX(
     GROUP_CONCAT(CARDTIME order by CARDTIME), 
     ',', 
     3), 
     ',', 
     -1) t3, 
    SUBSTRING_INDEX(
     SUBSTRING_INDEX(
     GROUP_CONCAT(CARDTIME order by CARDTIME), 
     ',', 
     2), 
    ',', 
    -1) t2 
    FROM 
    tablename 
    GROUP BY 
    id, staff_ID, STAFFNAME, 
    DATE(CARDTIME) 
) s 

這還不算最優化,而不是SQL標準,你也應該確保在每一天四次cardtimes。但它應該返回你需要的結果。

請參閱小提琴here

編輯

如果聘用過的員工可以有少於或多於4個cardtime條目,你應該考慮使用此查詢:

SELECT * 
FROM (
    SELECT 
    id, 
    staff_ID, 
    STAFFNAME, 
    DATE(CARDTIME) AS card_day, 
    timediff(next_CARDTIME,CARDTIME) As t_diff, 
    CASE WHEN 
     CASE WHEN next_CARDTIME IS NULL THEN @n:=-1 ELSE @n:[email protected]+1 END MOD 2 = 0 
     THEN 'Work' ELSE 'Break' 
    END AS type 
    FROM (
    SELECT 
     t1.id, 
     t1.staff_ID, 
     t1.STAFFNAME, 
     t1.CARDTIME, 
     MIN(t2.CARDTIME) next_CARDTIME 
    FROM 
     tablename t1 LEFT JOIN tablename t2 
     ON (t1.id, t1.staff_ID) = (t2.id, t2.staff_ID) 
     AND DATE(t1.cardtime)=DATE(t2.cardtime) 
     AND t1.cardtime<t2.cardtime 
    GROUP BY 
     t1.id, t1.staff_ID, t1.STAFFNAME, t1.CARDTIME 
    ORDER BY 
     t1.id, t1.staff_ID, t1.STAFFNAME, t1.CARDTIME 
    ) s, (SELECT @n:=-1) r 
) s 
WHERE t_diff IS NOT NULL 

當然如果cardtime條目數爲奇數,最後入口這一天將是休息。看看這個fiddle

+0

非常感謝你 – kenjilaurel

+0

@kenjilaurel - 接受它,如果你發現它有幫助,請檢查答案左邊的標記,這是如何工作在這裏。謝謝:) –

+0

嗨,先生,您的查詢正在工作,但如何使它更具動態性?因爲如果總數超過4次,則查詢的輸出無效 – kenjilaurel

相關問題