2015-05-24 32 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的顺序不会改变我的情况。 –

相关问题