首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySql每日报告

MySql每日报告
EN

Stack Overflow用户
提问于 2013-04-07 11:22:37
回答 1查看 246关注 0票数 3

我正在尝试获得一些帮助来修复我的复杂查询。我在下面解释我的情况,谢谢。

我有以下两个表:

代码语言:javascript
复制
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

和以下查询:

代码语言:javascript
复制
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)

我得到了以下结果:

代码语言:javascript
复制
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

然而,我想要得到的是这个结果:

代码语言:javascript
复制
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 08计时,在2:08:06 08再次计时然而,在某些情况下,用户可能只做一次(数据库中未配对的记录),因此应该只对记录中的特定小时进行收费。例如,2013年4月5日的用户124。

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

EN

回答 1

Stack Overflow用户

发布于 2013-05-08 06:49:59

我认为即使你做到了这一点,也有一些潜在的设计陷阱:

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

如果人们晚上11点打卡,凌晨2点再打卡,会发生什么?

粗略地看一下,我认为你的sql没有考虑到跨越两个不同支付率的时间段?你绝对应该在你的测试数据中包含这个场景。

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

代码语言:javascript
复制
TIME, PRICE
 00:00,  75.00
 08:00,  50.00
 20:00,  75.00

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15858548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档