MySql 每日报告

Posted

技术标签:

【中文标题】MySql 每日报告【英文标题】:MySql Daily Report 【发布时间】:2013-03-29 07:43:23 【问题描述】:

我正在寻求一些帮助来修复我的复杂查询。我在下面解释我的情况,谢谢。

我有以下两张表:

ACTIVITY TABLE:

ID   USER_ID      CARD_ID    CLOCK
1      123        04675545   4/3/2013 1:07:06 PM
2      123        04675545   4/3/2013 2:08:06 PM
3      124        04675550   4/3/2013 2:07:06 PM
4      124        04675550   4/3/2013 4:07:06 PM
5      124        04675550   4/4/2013 10:07:06 AM
6      124        04675550   4/4/2013 2:00:00 PM
7      124        04675550   4/5/2013 4:07:06 PM
8      124        04675550   4/7/2013 8:00:00 AM
9      124        04675550   4/7/2013 5:00:00 PM

PRICE TABLE:

ID    FROMTIME    TOTIME       PRICEPERHOUR
1     08:00:00    19:59:59     50.00
2     20:00:00    07:59:59     75.00

还有以下查询:

select a.user_id, date(a.clock),  ABS(TIME_TO_SEC(TIMEDIFF(a.clock, b.clock))/3600)*c.PRICEPERHOUR as total from 
(Select if((@rn:=@rn+1)%2=0,@rn,@rn-1) As rId, act.* from act
join (select @rn:=-1)a
order by user_Id, clock) a 
inner join 
(Select if((@rn1:=@rn1+1)%2=0,@rn1,@rn1-1) As rId, act.* from act
join
(select @rn1:=-1)b
order by user_Id, clock) b
ON a.rid=b.rid AND a.id <> b.id 
inner join 
price c
on 
TIME_TO_SEC(a.clock) between TIME_TO_SEC(c.FROMTIME) 
AND 
TIME_TO_SEC(c.TOTIME)
group by a.user_id, date(a.clock)

我得到以下结果:

USER_ID    DATE(A.CLOCK)                    TOTAL  
123        April, 03 2013 00:00:00+0000     50.8333
124        April, 03 2013 00:00:00+0000     100
124        April, 04 2013 00:00:00+0000     194.0833
124        April, 05 2013 00:00:00+0000     1,994.0833
124        April, 07 2013 00:00:00+0000     1,994.0833

但是,我试图得到这个结果:

USER_ID    DATE(A.CLOCK)                    TOTAL  
123        April, 03 2013 00:00:00+0000     50.8333
124        April, 03 2013 00:00:00+0000     100
124        April, 04 2013 00:00:00+0000     194.0833
124        April, 05 2013 00:00:00+0000     50
124        April, 07 2013 00:00:00+0000     450

这是时钟系统的一部分。每次用户签到时,都会在数据库中记录一个条目。正确的用户行为将是它始终记录一对记录。例如,user_id 123 在下午 1:07:06 计时,在下午 2:08:06 再次计时。但是,在某些情况下,用户可能只执行一次(数据库上的未配对记录),因此只应从记录中的特定小时收费。例如,2013 年 4 月 5 日的用户 124。

我整个周末都在努力让这个查询正常工作:(。一旦我得到正确的结果,我将添加一个条件来只获得一个 user_id,(例如,其中 user_id=124)。

【问题讨论】:

@Meherzad,对上述最佳方法有任何想法吗?非常感谢 【参考方案1】:

我认为即使你设法做到了,也存在一些潜在的设计缺陷:

人们每天可以打卡超过 1 个时段吗?如果是这样,那么例如 2 条记录 上午 10 点和下午 2 点可能总共需要 2 小时或 4 小时。

如果人们在晚上 11 点打卡又在凌晨 2 点打卡会怎样?

快速浏览一下,我认为您的 sql 没有考虑跨越 2 个不同工资率的时间段?你绝对应该在你的测试数据中包含这个场景。

如果我要实现这一点,我可能会将逻辑移动到代码中,并通过只有一个时间列来简化价格表,例如:

TIME, PRICE
 00:00,  75.00
 08:00,  50.00
 20:00,  75.00

此外,如果用户只有一张卡,您可能不需要在活动表中包含 card_id 和 user_id。

【讨论】:

嗨,保罗,非常感谢您的介入,对于迟到的回复,我深表歉意。我不知道这篇文章得到了回答。考虑到您的 cmets,我正在修改设计以使其更好。完成后我会在这里发布我所做的。

以上是关于MySql 每日报告的主要内容,如果未能解决你的问题,请参考以下文章

MySql 每日报告

使用 MySQL 生成按货币分组的填空每日销售报告

如何通过Mysql实现日报周报月报和年报?

每日日报111

每日日报

每日日报