一、签到模块效果图
产品设计:
1、用户当日登录后,首先能够看到:当前“累计签到”的总次数及该次数在所有用户中的排名情况;当月已签到日期(蓝色)
2、签到功能,签到后提示连续签到的天数,并提示已签到
二、签到模块数据库设计
一张签到流水表,所有用户的每次签到都在该表中生成记录。
三、业务sql
1、用户登录后看到用户“累计签到”的总次数及该次数在所有用户中的排名情况;当月已签到日期(蓝色)
1.0判断用户当日是否已签到
select count(1)
from MIC_TD_EXERCISE_SIGNIN s where to_char(s.SIGN_TIME,'yyyy-mm-dd') = to_char(sysdate,'yyyy-mm-dd') and s.user_id = 4
1.1获取用户累计签到的次数及排名
select userid,dense_rank() over(order by cou desc) from (select count(1) cou,s.USER_ID userid from MIC_TD_EXERCISE_SIGNIN s group by s.USER_ID) tmp
where tmp.userid = ?
注:oracle排序:
不连续排序:rank()over(order by column)
连续排序:dense_rank()over(order by column)
1.2获取当月已签到的所有日期(仅需包含日即可)
select SIGN_TIME
from MIC_TD_EXERCISE_SIGNIN t
where to_char(t.sign_time,'MM')=?
and to_char(t.sign_time,'yyyy')=? and user_id=?
2、用户签到
获取前一天的签到记录,如果没有,说明没有连续签到,此时sustain_day设置为1;如果有,获取前一天记录的sustain_day记录加一设置为新记录的sustain_day字段值。
select *
from MIC_TD_EXERCISE_SIGNIN s where to_char(s.SIGN_TIME,'yyyy-MM-dd') = to_char(sysdate-1,'yyyy-MM-dd') and s.USER_ID = ?;
插入数据
insert into MIC_TD_EXERCISE_SIGNIN values(?,?,sysdate,?)