连续签到的天数

<题目> 

给定一张用户签到表user_attendence,表中包含三个字段,分别是用户ID:【user_id】,日期:【date】,是否签到:【is_sign_in】,0否1是。

<问题1> 计算截至当前,每个用户已经连续签到的天数:

要求输出用户ID【user_id】和连续签到天数【recent_continuous_days】

 
select user_id,datediff('2021-06-01',max_date) as recent_continuous_days
from (
  select user_id,max(new_date) max_date
  from
    (
      select user_id,min(date) as  new_date from user_attendence where is_sigin_in=1 grou pby uid_id  -- 全勤,取最小的签到日期用于计算连续签到人数
      union all
      select user_id,date new_date from user_attendence where is_sigin_in=0
    ) t  group by user_id  -- 有未签到的,取最大未签到日期用于计算连续签到人数
  ) s
) r

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
你好!针对你的问题,我可以提供以下思路: 1. 首先,需要定义一个签到记录表,记录用户签到情况。该表可以包括用户ID、签到日期、签到状态等字段。 2. 在用户签到时,需要进行如下操作: a. 判断用户当天是否已经签到。 b. 如果当天已经签到,则返回签到失败。 c. 如果当天没有签到,则将签到状态更新为已签到。 d. 判断用户是否连续签到,如果是,则将用户连续签到天数加1,否则连续签到天数清零。 3. 在查询用户签到信息时,需要返回用户当月的签到情况,以及用户连续签到天数。 下面是一个简单的 Java 实现: ``` import java.time.LocalDate; import java.util.HashMap; import java.util.Map; public class SignInSystem { // 签到记录表 private Map<String, Map<LocalDate, Boolean>> records = new HashMap<>(); // 用户签到 public boolean signIn(String userId) { // 获取当前日期 LocalDate today = LocalDate.now(); // 获取用户签到记录 Map<LocalDate, Boolean> userRecords = records.getOrDefault(userId, new HashMap<>()); // 判断用户是否已经签到 if (userRecords.containsKey(today) && userRecords.get(today)) { return false; } // 更新用户签到记录 userRecords.put(today, true); records.put(userId, userRecords); // 计算连续签到天数 int consecutiveDays = 0; for (LocalDate date = today.minusDays(6); date.isBefore(today.plusDays(1)); date = date.plusDays(1)) { if (userRecords.containsKey(date) && userRecords.get(date)) { consecutiveDays++; } else { consecutiveDays = 0; } } // 返回签到结果 return true; } // 查询用户签到情况 public Map<LocalDate, Boolean> getSignInRecords(String userId) { return records.getOrDefault(userId, new HashMap<>()); } // 查询用户连续签到天数 public int getConsecutiveDays(String userId) { // 获取当前日期 LocalDate today = LocalDate.now(); // 获取用户签到记录 Map<LocalDate, Boolean> userRecords = records.getOrDefault(userId, new HashMap<>()); // 计算连续签到天数 int consecutiveDays = 0; for (LocalDate date = today.minusDays(6); date.isBefore(today.plusDays(1)); date = date.plusDays(1)) { if (userRecords.containsKey(date) && userRecords.get(date)) { consecutiveDays++; } else { consecutiveDays = 0; } } // 返回连续签到天数 return consecutiveDays; } } ``` 使用示例: ``` public static void main(String[] args) { SignInSystem signInSystem = new SignInSystem(); // 用户A签到 signInSystem.signIn("A"); // 查询用户A的签到情况 Map<LocalDate, Boolean> recordsA = signInSystem.getSignInRecords("A"); System.out.println(recordsA); // 查询用户A的连续签到天数 int consecutiveDaysA = signInSystem.getConsecutiveDays("A"); System.out.println(consecutiveDaysA); // 用户A连续签到7天 signInSystem.signIn("A"); signInSystem.signIn("A"); signInSystem.signIn("A"); signInSystem.signIn("A"); signInSystem.signIn("A"); signInSystem.signIn("A"); // 查询用户A的连续签到天数 consecutiveDaysA = signInSystem.getConsecutiveDays("A"); System.out.println(consecutiveDaysA); } ``` 希望能对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值