刚刚写了一个签到计算天数的sql, 记录下来.

思路如下:

获取当前签到的最后时间(今天或昨天), 定义一个变量@i 对签到时间进行天数自减, 然后查询出当前记录签到时间是否与自减后的时间匹配.   如果匹配表示天数是连续时间.

SELECT
count(1)
FROM
(
SELECT
date_sub(a.create_time, INTERVAL 1 DAY) create_time,
(
@i := DATE_ADD(@i, INTERVAL - 1 DAY)
) today
FROM
integral_sign a
INNER JOIN (
SELECT
@i := max(create_time)
FROM
integral_sign
WHERE
user_id = 33
AND TO_DAYS(create_time) = TO_DAYS(curdate())
OR TO_DAYS(create_time) = TO_DAYS(
DATE_ADD(curdate(), INTERVAL - 1 DAY)
)
) b
WHERE
a.user_id = 33
ORDER BY
a.create_time DESC
) c
WHERE
TO_DAYS(today) = TO_DAYS(create_time)



优化版: 减少不必要的查询数据

SELECT
count(1)
FROM
(
SELECT
date_sub(a.create_time, INTERVAL 1 DAY) signDate,
(
@i := DATE_ADD(@i, INTERVAL - 1 DAY)
) today
FROM
(
SELECT
create_time
FROM
integral_sign
WHERE
user_id = 33
ORDER BY
create_time DESC
) a
INNER JOIN (
SELECT
@i := max(create_time) AS signMax
FROM
integral_sign
WHERE
user_id = 33
AND (
TO_DAYS(create_time) = TO_DAYS(curdate())
OR TO_DAYS(create_time) = TO_DAYS(
DATE_ADD(curdate(), INTERVAL - 1 DAY)
)
)
) b
WHERE
b.signMax IS NOT NULL
AND TO_DAYS(DATE_ADD(@i, INTERVAL - 1 DAY)) = TO_DAYS(
date_sub(a.create_time, INTERVAL 1 DAY)
)
) c

msql 计算连续签到天数的更多相关文章

  1. PHP计算连续签到天数以及累计签到天数

    代码如下: /** * 统计连续签到天数以及累计签到天数 * @param string $user_long_id 用户ID * @return array 一维数组 */ function sig ...

  2. sqlserver查询连续签到天数

    create table #t(keyId int identity,actionDate datetime)insert into #t(actionDate) select distinct Cr ...

  3. mysql计算连续天数,mysql连续登录天数,连续天数统计

    mysql计算连续天数,mysql连续登录天数,连续天数统计 >>>>>>>>>>>>>>>>>& ...

  4. Oracle计算连续天数,计算连续时间,Oracle连续天数统计

    Oracle计算连续天数,计算连续时间,Oracle连续天数统计 >>>>>>>>>>>>>>>>> ...

  5. Hive计算最大连续登陆天数

    目录 一.背景 二.算法 1. 第一步:排序 2. 第二步:第二列与第三列做日期差值 3. 第三步:按第二列分组求和 4. 第四步:求最大次数 三.扩展(股票最大涨停天数) 强哥说他发现了财富密码,最 ...

  6. PHP连续签到

    require "./global.php"; $act = isset($_GET['act']) ? $_GET['act'] : "error"; // ...

  7. sql -- 获取连续签到的用户列表

    签到表: 需求:统计连续签到的 用户 1.根据用户和日期分组 select user_name, sign_date from user_sign group by user_name, sign_d ...

  8. 计算连续的IP地址

    题目:要求计算连续的IP地址. 举例:起始IP为192.168.2.2,IP总个数为3,那么要求得的所有IP的为192.168.2.2,192.168.2.3,192.168.2.4.再举个例子,起始 ...

  9. PHP每日签到及连续签到奖励实现示例

    数据库字段 num 记录已经连续签到次数 times 记录签到的日期 格式年月日 如 20160101 PHP代码如下 <?php //获取今天的日期 $today = date('Ymd'); ...

随机推荐

  1. GitLab non-standard SSH port

    /***************************************************************************** * GitLab non-standard ...

  2. 解决跨域POST登录中IE不能正常工作的bug

    结合我的这篇blog <简单实用的跨域表单POST提交> 文章,这篇blog中的思路是解决在www.a.com站中登录 同时要把关联站www.b.com登录状态也设置成登录状态,在a中获取 ...

  3. 微软SaaS多租户解决方案

    微软SaaS多租户解决方案 docs.microsoft.com/en-us/azure/sql-database/saas-tenancy-app-design-patterns https://d ...

  4. IOS socket编程--Asyncsocket

    iPhone的标准推荐是CFNetwork 库编程,其封装好的开源库是 cocoa AsyncSocket库,用它来简化CFNetwork的调用,它提供了异步操作 主要特性有: 队列的非阻塞的读和写, ...

  5. BZOJ3632: 外太空旅行

    BZOJ1547: 周末晚会 https://lydsy.com/JudgeOnline/problem.php?id=1547 分析: 对于一个串旋转若干次会回到本身,旋转次数即是同构个数,这个东西 ...

  6. 在DIV里面让图片居中

    .content.itemDiv{ display: table-cell;width: 171px;height: 133px;text-align: center; vertical-align: ...

  7. 【转】eclipse + Pydev 配置Python开发环境

    原文网址:http://www.cnblogs.com/dflower/archive/2010/05/13/1734522.html 1. 下载并安装python,由于3.1版本貌似存在很多兼容问题 ...

  8. BroadcastReceiver用法

    动态注册广播接收器 1.创建一个Receiver继承BroadcastReceiver,并重写onReceiver() 2.在Activity的OnCreate()中添加广播接收器想要接收的actio ...

  9. Vue.js:模版语法

    ylbtech-Vue.js:模版语法 1.返回顶部 1. Vue.js 模板语法 Vue.js 使用了基于 HTML 的模版语法,允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据. Vu ...

  10. 查询mysql 哪些表正在被锁状态

    查询mysql 哪些表正在被锁状态 show OPEN TABLES where In_use > 0; 参考链接:http://zhidao.baidu.com/link?url=tCQ70t ...