2015-05-24 86 views
2

我想從MySQL表中導出特定月份(基於用戶輸入)的數據,我不想計算當月每天的created_at之間的差異。根據類型計算每月中每天的行之間的差異

attendance_id:

  • 1 =到來
  • 2 =出口
  • 10 =從家裏
工作

當用戶開始工作他的入口被記錄爲1(到達)當他離開工作時,他的出口記錄爲2(到達)。 用戶也可以在家中工作,當他們開始將其記錄爲10(在家工作)時,他們停止記錄爲2(退出)。 表user_attendance

+-----+---------+---------------+----------------+----------------+ 
| id | user_id | attendance_id | created_at | updated_at | 
+-----+---------+---------------+----------------+----------------+ 
| 52 |  45 |    1 | 1.4.2015 6:48 | 1.4.2015 6:48 | 
| 53 |  31 |    1 | 1.4.2015 6:52 | 1.4.2015 6:52 | 
| 132 |  45 |    2 | 1.4.2015 13:58 | 1.4.2015 13:58 | 
| 133 |  31 |    2 | 1.4.2015 14:32 | 1.4.2015 14:32 | 
| 159 |  45 |    1 | 2.4.2015 6:49 | 2.4.2015 6:49 | 
| 160 |  31 |    1 | 2.4.2015 6:52 | 2.4.2015 6:52 | 
| 232 |  31 |    2 | 2.4.2015 15:06 | 2.4.2015 15:06 | 
| 233 |  45 |    2 | 2.4.2015 15:09 | 2.4.2015 15:09 | 
| 252 |  74 |   10 | 3.4.2015 6:52 | 3.4.2015 6:52 | 
| 253 |  74 |    2 | 3.4.2015 15:52 | 3.4.2015 15:52 | 
+-----+---------+---------------+----------------+----------------+ 

SQL:

CREATE TABLE IF NOT EXISTS `user_attendance` (
`id` int(11) NOT NULL, 
    `user_id` int(10) unsigned NOT NULL, 
    `attendance_id` int(10) NOT NULL, 
    `created_at` datetime NOT NULL, 
    `updated_at` datetime NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=2836 ; 

我嘗試:

SELECT A.user_id, A.created_at,HOUR(TIMEDIFF(B.created_at,A.created_at)) AS timedifference 
FROM user_attendance A CROSS JOIN user_attendance B 
WHERE B.id IN (SELECT MIN(C.id) FROM user_attendance C WHERE C.id > A.id) and A.user_id=45 and A.attendance_id in(1,2) and MONTH(A.created_at)=5 
ORDER BY date(A.created_at) ASC 

正如你可以看到我有它僅限於特定的用戶和兩種類型(到達和出口),但結果不正確,因爲時差是0.

+0

我希望你已經有了一個可以在數據也是如此,因爲樣本數據是針對4月份的,但是您在查詢中設置了5月份 –

+0

是的,我有抱歉的「錯誤」示例數據。 – SuperManSL

回答

0
 select ua.day(a.created_at) as day,ua.user_id, HOUR(timediff(max(created_at),min(created_at))) as TimeDiff 
from user_attendance ua 
where ua.created_at between '2015-05-01 00:00:00' and '2015-05-31 23:59:59' 
group by day(ua.created_at),ua.user_id 
order by ua.user_id 
+0

如果您已經在where子句中定義了單個日期,那麼使用group by ua.day(a.created_at)是什麼意思? –

+0

答案已更新。請一次檢查一次 –

+0

您的回答非常好,因爲它比較了第一個和最後一個created_at,因此無論什麼類型的attendance_id入口都有影響。 我必須提及的一件事是,你在ua.day(a.created_at)有錯字,它應該是DAY(ua.created_at),這個錯字是在選定的字段和group by子句中。 – SuperManSL

0

如果錯誤a再排除與操作的順序始終是1-2,也談到在同一天出門我的解決辦法是:

SELECT A.user_id, A.created_at,HOUR(TIMEDIFF(B.created_at,A.created_at)) 
FROM user_attendance A, user_attendance B 
WHERE 
    A.attendance_id in (1,10) AND 
    B.attendance_id=2 AND 
    A.user_id=45 AND 
    B.user_id=A.user_id AND 
    DAY(A.created_at)=DAY(B.created_at) AND 
    MONTH(A.created_at)=5 
ORDER BY date(A.created_at) ASC 
+0

操作順序也可以是10-1。除此之外,我真的很喜歡你的解決方案。 – SuperManSL

+0

到達總是在同一天關閉(由CRON工作),所以1-2號僅限於一天。但就像我說的,之間可以訂購1-8-9-2(到貨,午餐,午餐停止,退出)。 – SuperManSL

+0

約10 - 它已更新。 1-8-9-2的順序不會改變我的情況。 –