msql 計算連續簽到天數


剛剛寫了一個簽到計算天數的sql, 記錄下來. 

思路如下:

獲取當前簽到的最后時間(今天或昨天), 定義一個變量@i 對簽到時間進行天數自減, 然后查詢出當前記錄簽到時間是否與自減后的時間匹配.   如果匹配表示天數是連續時間. 

SELECT
count(1)
FROM
(
SELECT
date_sub(a.create_time, INTERVAL 1 DAY) create_time,
(
@i := DATE_ADD(@i, INTERVAL - 1 DAY)
) today
FROM
integral_sign a
INNER JOIN (
SELECT
@i := max(create_time)
FROM
integral_sign
WHERE
user_id = 33
AND TO_DAYS(create_time) = TO_DAYS(curdate())
OR TO_DAYS(create_time) = TO_DAYS(
DATE_ADD(curdate(), INTERVAL - 1 DAY)
)
) b
WHERE
a.user_id = 33
ORDER BY
a.create_time DESC
) c
WHERE
TO_DAYS(today) = TO_DAYS(create_time)




優化版: 減少不必要的查詢數據

SELECT
count(1)
FROM
(
SELECT
date_sub(a.create_time, INTERVAL 1 DAY) signDate,
(
@i := DATE_ADD(@i, INTERVAL - 1 DAY)
) today
FROM
(
SELECT
create_time
FROM
integral_sign
WHERE
user_id = 33
ORDER BY
create_time DESC
) a
INNER JOIN (
SELECT
@i := max(create_time) AS signMax
FROM
integral_sign
WHERE
user_id = 33
AND (
TO_DAYS(create_time) = TO_DAYS(curdate())
OR TO_DAYS(create_time) = TO_DAYS(
DATE_ADD(curdate(), INTERVAL - 1 DAY)
)
)
) b
WHERE
b.signMax IS NOT NULL
AND TO_DAYS(DATE_ADD(@i, INTERVAL - 1 DAY)) = TO_DAYS(
date_sub(a.create_time, INTERVAL 1 DAY)
)
) c


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM