假设有以下表结构:
用户表:user(id, name) 签到表:checkin(id, user_id, location, checkin_time)
可以使用以下 SQL 语句统计每个月,每个用户待在某地的天数:
SELECT
user.name,
YEAR(checkin.checkin_time) AS year,
MONTH(checkin.checkin_time) AS month,
COUNT(DISTINCT DATE(checkin.checkin_time)) AS days
FROM
user
INNER JOIN checkin ON user.id = checkin.user_id
WHERE
checkin.location = '某地'
GROUP BY
user.id,
YEAR(checkin.checkin_time),
MONTH(checkin.checkin_time)
ORDER BY
user.name,
year,
month;
说明:
- 使用 INNER JOIN 连接用户表和签到表;
- 在 WHERE 子句中过滤指定位置的签到记录;
- 使用 YEAR 和 MONTH 函数提取签到时间的年份和月份;
- 使用 DISTINCT 和 DATE 函数统计每个用户每个月不同的日期数量,即该用户在该地待了多少天;
- 使用 GROUP BY 分组,并按照用户名、年份、月份排序。




