剛剛寫了一個簽到計算天數的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