mysql如何查询两个日期之间最大的连续登录天数_Mysql

前言

最近工作中遇到一个需求,是根据用户连续记录天数来计算的,求出用户在一段时间内最大的连续记录时间,例如在 2016-01-01 和 2016-01-28 之间,如果用户在3号和4号都记录了,那么连续记录天数为2,如果用户在6号-10号每日都记录了,那么最大连续记录天数为5.

拿到这个需求的时候,说实话有点懵,第一想到的就是在代码中去统计,会用到循环,想到那么多个用户,并且时间跨度也有点大,比如15年到16年,两年时间,想想就有点恐怖。

解决方案

然后就把这个需求跟朋友说了,朋友也觉得有点难搞,后来通过网上一篇文章有了一些小思路。但是看得也是一知半解的,虽然经常写 sql 语句,但也是常用的那些增删改查,像这样使用的方式根本没用过,过了会,朋友又扔给我一条 sql 语句,就在该文章的基础上进行了修改,以符合我的项目需求的语句。

SELECT *
FROM (SELECT *
   FROM (
       SELECT
        uid,
        max(days)   lianxu_days,
        min(login_day) start_date,
        max(login_day) end_date
       FROM (SELECT
           uid,
           @cont_day :=
           (CASE
           WHEN (@last_uid = uid AND DATEDIFF(created_ts, @last_dt) = 1)
            THEN
             (@cont_day + 1)
           WHEN (@last_uid = uid AND DATEDIFF(created_ts, @last_dt) < 1)
            THEN
             (@cont_day + 0)
           ELSE
            1
           END)                       AS days,
           (@cont_ix := (@cont_ix + IF(@cont_day = 1, 1, 0))) AS cont_ix,
           @last_uid := uid,
           @last_dt := created_ts                login_day
          FROM (SELECT
              uid,
              DATE(created_ts) created_ts
             FROM plan_stage
             WHERE uid != 0
             ORDER BY uid, created_ts) AS t,
           (SELECT
            @last_uid := '',
            @last_dt := '',
            @cont_ix := 0,
            @cont_day := 0) AS t1
         ) AS t2
       GROUP BY uid, cont_ix
       HAVING lianxu_days > 10
      ) tmp
   ORDER BY lianxu_days DESC) ntmp
GROUP BY uid;

查询出来的结果如下图所示:

如果要查看单个人的,那么将 sql 语句中的 uid !=0 改成具体的值即可。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家学习或者使用sql语句能有所帮助,如果有疑问大家可以留言交流。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索mysql
, 统计连续天数
, 连续天数
连续签到天数
mysql日期相差天数、mysql 连续签到天数、mysql 日期间隔天数、mysql 统计连续天数、mysql 日期加天数,以便于您获取更多的相关知识。

时间: 2024-08-08 13:25:56

mysql如何查询两个日期之间最大的连续登录天数_Mysql的相关文章

MySQL查询两个日期之间记录的方法

网上搜索出来的结果多是下面答案: MySQL中,如何查询两个日期之间的记录,日期所在字段的类型为datetime(0000-00-00 00:00:00) 解决方案: 直接使用><=就可以查询. where createDate<'2003-5-31' and createDate>'2003-2-30'; 其实简单美好的写法可以是这样的 where createDate between'2010-08-01'  and  '2010-08-19' 看完了之后,你是不是觉得后者比较

oracle 利用between查询两个日期之间数据

sql中的conditions是在select,delete,update语句常常用到的,其中range condition只包含:(not)between..and. 2)oracle的between..and..前后都是闭区间,也就是说包含两个端的数,例如: SELECT * FROM employees   WHERE salary   BETWEEN 2000 AND 3000;查询返回 2000<=工资<=3000的员工 3)当前者数大于后者,如:salary between 100

php判断两个日期之间相差多少个月份的方法

  本文实例讲述了php判断两个日期之间相差多少个月份的方法.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 /** * @author injection(injection.mail@gmail.com) * @var date1日期1 * @var date2 日期2 * @var tags 年月日之间的分隔符标记,默认为'-' * @return 相差的月份数量 * @example: $date1 = "

ASP.NET如何获取两个日期之间的天数

 这篇文章主要介绍了ASP.NET获取两个日期之间的天数方法,需要的朋友可以参考下  代码如下: DateTime startdate=DateTime.Parse("2013-11-01");  DateTime enddate = DateTime.Parse("2013-11-11");  int d = enddate.Subtract(startdate).Days;    定义开始时间startdate  结束时间enddate  使用方法Subtrac

Python获取两个日期之间的列表

QQ交流群:127591054 JackChiang QQ:595696297 获取两个日期之间的日期列表如:输入2012-09-21~2013-10-21 得到的结果为:2012-09-21,2012-09-22等等一直到2013-10-21 调用get_date_list函数传入一个时间范围列表:如get_date_list([1,'2012-09-21','2013-10-21']) 传入参数列表第0个代表状态,0代表日期传入是错误的,1,代表传入一个日期.2.代表传入两个日期,并且第二个

查询两个用户之间的对话记录

问题描述 采用服务端集成方式调用环信接口,本人需要查询两个用户之间的对话记录,根据demo,可以按from和to,能查询发送者和接收者的单向消息记录,而我的操作是一次全部查出两个的对话记录.后来发现有个扩展属性,让扩展属性的值唯一,然后根据扩展属性查询两人的对话记录,这种方式可行吗? 解决方案 调用rest导出聊天记录只支持时间戳查询

link用循环计算两个日期之间有多少工作日

问题描述 link用循环计算两个日期之间有多少工作日 用循环计算两个日期之间有多少工作日,link怎么实现?用takewhile怎么代替while? 解决方案 不考虑过节和轮休,写一个给你 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1 { class P

java-怎么排除两个日期之间的节假日,下面我这个是计算排除周末的工作时间,怎么把节假日排除掉,求指教

问题描述 怎么排除两个日期之间的节假日,下面我这个是计算排除周末的工作时间,怎么把节假日排除掉,求指教 package server; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class CalculateHours { SimpleDateFormat format = new SimpleDateFormat( "yyyy-MM-dd H

oracle中如何获取两个日期之间指定星期的日期是多少

问题描述 oracle中如何获取两个日期之间指定星期的日期是多少 如题,现在用户选择了一个起始日期和截止日期, 也选择了几个星期, 那么如何得到他选择的这几个星期的日期分别是多少? 解决方案 获取两个日期之间星期X的日期列表获取两个日期之间的日期间隔获取指定日期是星期几 解决方案二: 我的思路是这样的 1.写个方法,获取 起始,截止 日期之间 所有的日期 2.oracle提供了获取指定日期是星期几 的 函数 把选定的星期作为条件即可 解决方案三: DECLARE v_date date; v_n