获取连续登陆天数,连续签到天数,类似这样的需求应该是一个常见的需求,那么我们有没有一套成熟的解决方案呢 ?下面我来跟大家分享一下我的故事。

在猴年马月的一天,有个用户反馈个人中心打开缓慢,需要7、8秒,做为一个认真负责任的程序员GG,我尼玛放下手中的其他工作,跟踪调查并且解决该问题。

第一步重现问题:

连着登陆了好几个账号到个人中心,打开都不慢呀 ,那是什么问题呢,就你一个人出问题,是你人品差吧,正当打算以此敷衍用户的时候,测试组的小陶说,他也遇到了这个问题,纳尼 !!你个人品差的家伙 ,让俺来看看,你要重现不了,看我不打死你。 于是他登陆账号试了一下,果然是有些缓慢,大概在4、5秒的样子,嗯,至此,这个问题重现成功了 。嗯,厉害 。

第二步查找问题根本原因:

总不是这两个人人品都差吧,经过一番严密的调查,问题最终锁定在获取连续签到次数上,别问我怎么查到的,因为这两个奇葩居然做到连续签到近100天的牛逼战绩,然后获取连续签到的存储过程采用的循环算法是连续登陆天数越多,算法复杂度就越高。下面贴存储过程代码:

1 --循环法

declare @day int = 1, --2 @userId int =1, --用户id

3 @count int = 0 , --连续签到多少天

4 @isSinginToday int --今天是否签到

5

6 while exists ( select * from#SignInLog7 where UserId = @UserId and DATEDIFF(day ,createtime ,getdate() ) = @day)8 begin

9 set @count = @count + 1 --【循环方法】

10 set @day = @day + 1 --

11 end

12

13 select @isSinginToday =COUNT(*) from #SignInLog where UserId = @UserId and DATEDIFF(day ,createtime ,getdate() ) = 0 --今天是否登录

14

15

16 select @isSinginToday , --当天是否签到

17 @count + @isSinginToday --连续签到n天

把表结构也贴出来吧,省得你们这些懒人造数据麻烦,检验代码麻烦

--用户签到日志表

create table #SignInLog ( UserId int, --用户id

CreateTime datetime )--签到时间

insert into #SignInLog values(1,'20160924'),

(1,'20160923'),

(1,'20160922'),

(1,'20160921'),

(1,'20160919'),

(2,'20160924'),

(2,'20160923'),

(2,'20160920' )

可以看到这个存储过程采用循环的方法,去检查前一天是否签到,有的话继续查前一天,并把用于统计连续签到天数的计数器加一 ,前一天没有签到的话作为退出循环的条件,真是段思路清晰的好代码。但是随着连续次数的增多,select语句的执行次数也会增多,所以才会出现了那些连续签到天数多的人缓慢,连续签到天数少的人正常的情况 。 嗯....... 原因也找到了。喝杯茶压压惊先。

最后一步了,也是最难的,解决问题:

这代码也没毛病,不换个思路的话,问题应该也得不到解决。正当我绞尽脑汁的时候,我有点想上厕所了,正当我上厕所的时候,灵感来了,(为了有意让灵感发生在洗手间,容易吗我)一个sql的函数映入我的眼帘,rownumber()  。于是最后给这个方法取的名字就叫rownumber法。看代码:

--【row_number 法 】

declare @now datetime = getdate() ,@count int,@userid int = 1,@isSinginToday int

select @count = count(*) from(select datediff( day , CreateTime , @now ) aa , --签到时间对比今天的差值

row_number() over (order by createtime desc ) bb --排序字段

from#SignInLogwhere UserId = @userId and datediff( day , CreateTime , @now ) > 0 --条件排除今天的签到记录

) T where aa =bbselect @isSinginToday =COUNT(*) from #SignInLog where UserId = @UserId and DATEDIFF(day ,createtime ,getdate() ) = 0 --今天是否登录

select @isSinginToday , --当天是否签到

@count + @isSinginToday --连续签到n天

这代码思路也算清晰的, 同学们,不知道你们看完这个故事,学到了没。

mysql 连续签到天数_获取连续登陆天数,连续签到天数 ,方法优化相关推荐

  1. java返回当年的天数_获取Java中当年剩余的天数

    要获取当年剩余的天数,请找出当年总天数与经过的总天数之差. 首先,计算一年中的日期.Calendar calOne = Calendar.getInstance(); int dayOfYear =  ...

  2. 简单的签到代码_开窗排序函数解决连续签到问题|SQL

    开窗排序函数除了在处理简单的排序问题外,它的应用场景远比我们想的要多.本文将对两个问题,介绍开窗排序函数的用法. 一.问题 有一张用户签到表[签到表],标记每天用户是否签到(说明:该表包含所有用户所有 ...

  3. mysql计算年休假天数_年休假的工作年限和天数如何计算公式

    向我提问 赖贺明律师 解答问题:13229条 |好评:149个 " 一.法律根据 <职工带薪年休假条例>.<企业职工带薪年休假实施办法> 二.职工享受带薪年休假的天数 ...

  4. mysql计算年休假天数_年休假的工作年限和天数如何计算

    向我提问 赖贺明律师 解答问题:13229条 |好评:149个 " 一.法律根据 <职工带薪年休假条例>.<企业职工带薪年休假实施办法> 二.职工享受带薪年休假的天数 ...

  5. python实现app自动签到器_利用Python实现App自动签到领取积分

    要自动签到,最简单的是打开页面分析请求,然后我们用脚本实现请求的自动化.但是发现食行没有页面,只有 APP,这不是一个好消息,这意味着需要抓包处理了. 有需要Python学习资料的小伙伴吗?小编整理[ ...

  6. 用python写一个手机app签到脚本_利用Python实现App自动签到领取积分

    要自动签到,最简单的是打开页面分析请求,然后我们用脚本实现请求的自动化.但是发现食行没有页面,只有 APP,这不是一个好消息,这意味着需要抓包处理了. 有需要Python学习资料的小伙伴吗?小编整理[ ...

  7. mysql时间间隔interval_MySQL DATEDIFF函数获取两个日期的时间间隔的方法

    描述 返回两个日期之间的时间间隔. 语法 DateDiff(interval, date1, date2 [ ,firstdayofweek[ , firstweekofyear]] ) DateDi ...

  8. mysql groupby 取值_mysql获取groupby总记录行数的方法

    本文实例讲述了mysql获取group by总记录行数的方法,分享给大家供大家参考.具体方法分析如下: 一般来说,mysql获取group by内部可以获取到某字段的记录分组统计总数,而无法统计出分组 ...

  9. html 获取控件位置,html控件_获取HTML中的父控件方法

    摘要 腾兴网为您分享:获取HTML中的父控件方法,月星家居,优衣库,易视云3,悟空单车等软件知识,以及vsco安卓,墨墨背单词,八一军婚网,英语打字软件,地球仪,游戏音效制作,launcher.exe ...

最新文章

  1. python subprocess.Popen 使用简介
  2. OpenCV霍夫线圆HoughLinesCircles的实例(附完整代码)
  3. Java黑皮书课后题第5章:*5.31(金融应用:计算CD价值)假设你用10 000美元投资一张CD,年利率为5.75%。编写程序,提示由用户输入一个金额数、年获利率、月份数,然后显示一个表格
  4. 深度学习之基于Tensorflow2.0实现AlexNet网络
  5. 在线生成文本图片 CFC函数计算版
  6. 1057: [ZJOI2007]棋盘制作 - BZOJ
  7. 没事聊聊C++局域网聊天软件
  8. vue多选框点击其中一个控制div隐藏_Vue 零碎知识点
  9. 【SeaJS】【1】初识SeaJS
  10. 利用Applet类和Runnable接口实现滚动字幕
  11. ATAC-seq以及相关技术(DNase-seq,MNase-seq,NOMe-seq)的发展
  12. PHP漏洞全解(三)-客户端脚本植入
  13. 大意导致Java访问DB2库时导出SQLCODE=-301, SQLSTATE=07006错误
  14. 读ISSCC TOF部分论文
  15. 2022全球量子通信产业发展报告
  16. 拳皇97c语言编码,拳皇97(格斗王97)
  17. 不小心把文件夹管理员权限删除的回复方法
  18. 使用stream将List转换为用逗号拼接的字符串
  19. How to manage the changes in Netlogon secure channel connections associated with CVE-2020-1472
  20. 人生感悟--------藏锋

热门文章

  1. lg空调代码大全解决_LG空调故障代码大全31905
  2. 【懒人必备】智能窗帘机器人,告别手动拉窗帘——软件功能实现篇
  3. 计算机C盘那些可以清理,电脑C盘满了怎么清理,哪些文件可以删除?
  4. 金算盘 未找到 oracle,金算盘软件操作手册 第一章安装、启动和退出
  5. oracle强制执行计划,Oracle里另外一些典型的执行计划
  6. 用Jupyter练习pytroch时, 用matplotlib结果内核崩溃
  7. 开挂进大厂:BATJ面试官能问到的Java面试题,都被打包在这份PDF文档里
  8. 利用外部邮箱发送邮件的方法
  9. Latex中多行公式换行及设置编号位置
  10. python docx 加粗的边框_修改固定行与列的加粗边框显示样式