連続して署名して、連続した日数だけを計算して、切れたら0で再計算して、親測は利用できます!
1.今日と昨日の時間を取得し、今日または昨日に署名記録がないことが発見された場合、連続署名は0.今日または昨日に署名レコードが見つかった場合、署名日の逆順序に基づいて最大(最近)の署名時間-1日の自然日を生成し、2つの日付を比較して連続署名日数を取得します.
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