SQL Server 2008 R2存储过程中如何实现连续登录天数统计?
实现连续登录天数累加的方案
这个需求我之前碰过好几次,核心就是要精准判断本次登录和上次登录的日期关系,同时还要避免用户同一天多次登录导致连续天数重复累加。结合你用的SQL Server(从getdate()能看出来),我给你调整一下存储过程里的UPDATE语句,完美实现这个功能:
UPDATE AccountsTable SET LogDate = GETDATE(), ConsecutiveDays = CASE -- 第一次登录(之前没有登录记录),直接设为1天 WHEN LogDate IS NULL THEN 1 -- 上次登录是昨天(日期连续),且本次不是当天重复登录,连续天数+1 WHEN CAST(LogDate AS DATE) = DATEADD(DAY, -1, CAST(GETDATE() AS DATE)) AND CAST(LogDate AS DATE) <> CAST(GETDATE() AS DATE) THEN ConsecutiveDays + 1 -- 当天重复登录,保持原有连续天数不变 WHEN CAST(LogDate AS DATE) = CAST(GETDATE() AS DATE) THEN ConsecutiveDays -- 登录中断(比如上次是前天及更早),重置为1天 ELSE 1 END WHERE AccID = @identity;
关键逻辑说明:
- 用
CAST(xxx AS DATE)把登录时间转成纯日期格式,这样不管用户是昨天凌晨还是深夜登录,只要日期是昨天,就会被判定为连续登录 - 专门加了
CAST(LogDate AS DATE) <> CAST(GETDATE() AS DATE)的判断,防止用户同一天内多次登录时,连续天数被重复累加 - 首次登录的情况直接处理
LogDate IS NULL的场景,把连续天数设为1 - 如果登录中断(比如隔了一天没登),就把连续天数重置为1,重新开始计数
举个例子验证你的场景:
- 第1天(2018-04-11)登录:
LogDate设为当前时间,ConsecutiveDays变为1 - 第2天(2018-04-12)登录:判断上次日期是昨天,所以
ConsecutiveDays加1变成2 - 第3天(2018-04-13)登录:同样判定日期连续,
ConsecutiveDays变成3 - 如果第4天没登,第5天再登:此时上次日期和当前日期差2天,
ConsecutiveDays重置为1
如果用户同一天内多次登录,比如2018-04-11登录两次,第二次登录时会触发“当天重复登录”的分支,ConsecutiveDays保持1不变,不会变成2,符合需求。
内容的提问来源于stack exchange,提问作者Plar625
相关产品推荐
相关产品推荐

