查询表时加个日期变量字段,然后倒序过虑计算签到天数
在张家口等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供做网站、成都做网站 网站设计制作按需定制制作,公司网站建设,企业网站建设,品牌网站建设,营销型网站建设,成都外贸网站建设,张家口网站建设费用合理。
如MYSQL:
select count(*) 连继签到天数 from (
select a.签到日期,(@i := DATE_ADD(@i,INTERVAL -1 day)) today from 签到表 a inner join
(select @i := max(签到日期) from 签到表 where 签到日期=curdate() or 签到日期=DATE_ADD(curdate(),INTERVAL -1 day)) b
order by a.签到时间 desc
) c where today = 签到日期
以淘宝网领取淘金币的签到系统为例:
目标:
第一天签到增加5个积分;第二天连续签到则增加8个积分;第三天连续签到,增加11个积分,第四天连续签到,增加15个积分;第五天连续签到,增加19个积分;第六天连续签到,增加24个积分;第七天连续签到,增加29个积分;第八天以后的连续签到,都增加29个积分。连续签到断开,则积分从第一天开始计算。
思路:
这个比较简单,思路是这样的:
在用户表里添加一个连续登录的字段,如果每天连续登录自增1,如果超过24小时的话就直接归0.
再增加一个最后登录的时间,格式是时间戳的。
首先判断最后登录的时间和现在的时间的时间差值是多少,函数如下:
?php
function checkTime() {
if (time() - 最后登录时间 24*60*60 ) { // 判断时间是否大于24小时
// 让字段归0
}
}
?
这个样子就可以了。
至于加分就简单了。
如果字段值为:
1就加5,
2就加8,
3就加11,
4就加15,
5就加19,
6就加24,
大于7就加29
设计表结构时 多加一个字段 来存放连续签到天数, 每次 签到时更新这个字段 要简单的多
否则你需要 每个人 都循环判断前一天是否签到的方法来解决
参考代码
1 --循环法
declare @day int = 1, --
2 @userId int =1, --用户id
3 @count int = 0 , --连续签到多少天
4 @isSinginToday int --今天是否签到
5
6 while exists ( select * from #SignInLog
7 where UserId = @UserId and DATEDIFF(day ,createtime ,getdate() ) = @day )
8 begin
9 set @count = @count + 1 -- 【循环方法】
10 set @day = @day + 1 --
11 end
12
13 select @isSinginToday =COUNT(*) from #SignInLog where UserId = @UserId and DATEDIFF(day ,createtime ,getdate() ) = 0 --今天是否登录
14
15
16 select @isSinginToday , --当天是否签到
17 @count + @isSinginToday -- 连续签到n天
如果数据库支持 row_number(), mysql 不支持此函数...
可以用
declare @now datetime = getdate() ,
@count int ,
@userid int = 1 ,
@isSinginToday int
select @count = count(*) from (
select datediff( day , CreateTime , @now ) aa , --签到时间对比今天的差值
row_number() over (order by createtime desc ) bb --排序字段
from #SignInLog
where UserId = @userId and datediff( day , CreateTime , @now ) 0 --条件排除今天的签到记录
) T where aa = bb
select @isSinginToday =COUNT(*) from #SignInLog where UserId = @UserId and DATEDIFF(day ,createtime ,getdate() ) = 0 --今天是否登录
select @isSinginToday , --当天是否签到
@count + @isSinginToday -- 连续签到n天