连续签到,只计算连续的天数,断掉则为0重新计算

  1.获取到今天和昨天的时间,如果发现今天或昨天没有签到记录,则 连续签到为0
  2.如果今天或昨天发现签到记录,根据签到日期倒序,然后生成最大(最近)的签到时间 - 1天的自然日,将两列日期进行对比,得到连续签到天数 

SELECT
count(1)
FROM
(
SELECT
date_sub(a.create_date, INTERVAL 1 DAY) signDate,
(
@i := DATE_ADD(@i, INTERVAL - 1 DAY)
) today
FROM
(
SELECT
create_date
FROM
active_task_detail
WHERE
user_id = #{userId}
ORDER BY
create_date DESC
) a
INNER JOIN (
SELECT
@i := max(create_date) AS signMax
FROM
active_task_detail
WHERE
user_id = #{userId}
AND (
TO_DAYS(create_date) = TO_DAYS(curdate())
OR TO_DAYS(create_date) = TO_DAYS(
DATE_ADD(curdate(), INTERVAL - 1 DAY)
)
)
) b ON b.signMax IS NOT NULL
AND TO_DAYS(DATE_ADD(@i, INTERVAL - 1 DAY)) = TO_DAYS(
date_sub(a.create_date, INTERVAL 1 DAY)
)
) c


作者:来世还生华夏门
来源:CSDN
原文:https://blog.csdn.net/qq_38708432/article/details/96424805
版权声明:本文为博主原创文章,转载请附上博文链接!

在ThinkPHP框架中实现一个每日连续签到功能,我们需要考虑以下几个方面: 1. 数据库设计:首先,需要在数据库中创建一个用户表和一个签到记录表。用户表存储用户信息,签到记录表存储用户每签到信息。 2. 用户签到逻辑:在签到逻辑中,需要判断用户是否已经签到,如果已经签到,则需要记录签到日期;如果用户今还没有签到,那么应该判断用户昨是否签到,以此来确定是否为连续签到。 3. 奖励机制:可以设置一个数组来存储连续签到不同天数对应的奖励,比如1签到奖励A,2签到奖励B,以此类推。在用户签到时,根据连续签到天数给用户发放相应的奖励。 以下是一个简化的代码示例: ```php // 假设使用ThinkPHP的M方法来操作模型 $UserModel = M('User'); // 用户模型 $SignModel = M('Sign'); // 签到记录模型 // 获取当前用户ID $userId = session('userId'); // 获取用户信息 $user = $UserModel->find($userId); // 获取用户今日签到状态,如果没有签到记录,就认为未签到 $todaySignStatus = $SignModel->where(array( 'userId' => $userId, 'signDate' => date('Y-m-d') ))->find(); // 如果用户今日已签到,则不做任何操作 if (!$todaySignStatus) { // 获取用户昨签到记录 $yesterdaySignStatus = $SignModel->where(array( 'userId' => $userId, 'signDate' => date('Y-m-d', strtotime('-1 day')) ))->find(); // 如果昨也没有签到,则今连续的第一 if (!$yesterdaySignStatus) { $SignModel->data(array( 'userId' => $userId, 'signDate' => date('Y-m-d') ))->insert(); } else { // 如果昨已经签到,今继续签到,更新连续签到天数 $SignModel->where(array( 'userId' => $userId, 'signDate' => $yesterdaySignStatus['signDate'] ))->setField('continuousDays', $yesterdaySignStatus['continuousDays'] + 1); } } // 根据连续签到天数判断奖励 $reward = array( '1' => '奖励A', '2' => '奖励B', '7' => '奖励C' // 7一轮的奖励 ); // 假设用户今连续签到了第N $continuousDays = // ...获取连续签到天数的逻辑... // 根据连续签到天数发放奖励 if (isset($reward[$continuousDays])) { $user->reward($reward[$continuousDays]); $user->save(); } ``` 需要注意的是,以上代码仅作为示例,实际开发中需要根据具体的业务逻辑和数据库结构进行调整。另外,连续签到功能可能涉及到日期的计算和缓存问题,需要考虑效率和准确性。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值