前言:
最近产品提了一个新需求,连续签到,然后天数不同,奖励也不同,如果期间中断一天,则重新开始计算连续签到天数
思路:
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