連続して署名して、連続した日数だけを計算して、切れたら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