MS-SQL中取用户连续签到的次数
2017-12-08 17:19
609 查看
下:
每个用户每天只能签到一次
现在前面的需求是判断某个用户在某天是否是连续签到,使用sql中的递归来实现
原文如下:
判断 “存在连续天数” 的处理
最近遇到一个问题, 说某个打卡的系统, 要打卡以后, 判断是否存在 连续7天打卡。
例如 2012年1月7日 打卡了, 那么去检查 2012年1月1日 至 2012年1月6日 是否都打了。
还存在这样的情况, 可能是 2012年1月4日 至 2012年1月6日都打了, 同时 2012年1月8日 至 2012年1月10日都打了。
新打一个 2012年1月7日的卡, 形成了一个 连续7日。 ( 2012年1月4日 -- 2012年1月10日 )
处理思路是:
1. 从打卡日, 一天一天向前递归,直到遇到 上限值(例如这里的7天), 或者遇到中断。
2. 从打卡日, 一天一天向后递归,直到遇到 上限值(例如这里的7天), 或者遇到中断。
3. 获取前面两个步骤所产生的: 向前递归的最小值, 与向后递归的最大值。 来计算, 打卡日作产生的 连续天数。
CREATE TABLE #t (
id INT identity(1,1),
test_date DATETIME
)
INSERT INTO #t
SELECT CONVERT(DATETIME, '20120101', 112) UNION ALL
SELECT CONVERT(DATETIME, '20120102', 112) UNION ALL
SELECT CONVERT(DATETIME, '20120103', 112) UNION ALL
SELECT CONVERT(DATETIME, '20120104', 112) UNION ALL
SELECT CONVERT(DATETIME, '20120105', 112) UNION ALL
SELECT CONVERT(DATETIME, '20120106', 112) UNION ALL
SELECT CONVERT(DATETIME, '20120107', 112) UNION ALL
SELECT CONVERT(DATETIME, '20120108', 112) UNION ALL
SELECT CONVERT(DATETIME, '20120110', 112) UNION ALL
SELECT CONVERT(DATETIME, '20120111', 112) UNION ALL
SELECT CONVERT(DATETIME, '20120112', 112) UNION ALL
SELECT CONVERT(DATETIME, '20120113', 112) UNION ALL
SELECT CONVERT(DATETIME, '20120114', 112) UNION ALL
SELECT CONVERT(DATETIME, '20120115', 112) UNION ALL
SELECT CONVERT(DATETIME, '20120116', 112) UNION ALL
SELECT CONVERT(DATETIME, '20120117', 112);
with currentDateCTE AS (
-- 当前天.
SELECT
*
FROM
#t
WHERE
test_date = CONVERT(DATETIME, '20120106', 112)
),
prevDateCTE AS (
-- 向前递归.
SELECT
*
FROM
currentDateCTE
UNION ALL
SELECT
prevTab.*
FROM
#t prevTab JOIN prevDateCTE
ON (prevTab.test_date = prevDateCTE.test_date - 1)
),
nextDateCTE AS (
-- 向后递归.
SELECT
*
FROM
currentDateCTE
UNION ALL
SELECT
prevTab.*
FROM
#t prevTab JOIN nextDateCTE
ON (prevTab.test_date = nextDateCTE.test_date + 1)
)
SELECT
(SELECT MIN(test_date) FROM prevDateCTE) AS [第一天],
(SELECT MAX(test_date) FROM nextDateCTE) AS [最后一天],
DATEDIFF (
dd,
(SELECT MIN(test_date) FROM prevDateCTE),
(SELECT MAX(test_date) FROM nextDateCTE)
) + 1 AS [存在的连续日期]
转载URL:http://hi.baidu.com/wangzhiqing999/item/2abb8bf3aeeb4a7d3c198b46
每个用户每天只能签到一次
现在前面的需求是判断某个用户在某天是否是连续签到,使用sql中的递归来实现
with currentDateCTE AS ( -- 当前天. SELECT * FROM dt_Signin WHERE user_id = 270 and CONVERT(DATE, sign_time) = CONVERT(DATE, '2013-05-16 22:15:32.670')--这就是需求中的某天 ), prevDateCTE AS ( -- 向前递归. SELECT * FROM currentDateCTE UNION ALL SELECT prevTab.* FROM (select * from dt_Signin where user_id = 270) as prevTab JOIN prevDateCTE ON (CONVERT(DATE,prevTab.sign_time) = CONVERT(DATE,convert(char(20),dateadd(day,-1,prevDateCTE.sign_time),102))) ), nextDateCTE AS ( -- 向后递归. SELECT * FROM currentDateCTE UNION ALL SELECT prevTab.* FROM (select * from dt_Signin where user_id = 270) as prevTab JOIN nextDateCTE ON (CONVERT(DATE,prevTab.sign_time) = CONVERT(DATE,convert(char(20),dateadd(day,+1,nextDateCTE.sign_time),102))) ) SELECT --(SELECT MIN(sign_time) FROM prevDateCTE) AS [第一天], --(SELECT MAX(sign_time) FROM nextDateCTE) AS [最后一天], DATEDIFF ( dd, (SELECT MIN(sign_time) FROM prevDateCTE), (SELECT MAX(sign_time) FROM nextDateCTE) ) + 1 AS signlxcount ---查询连续签到次数
原文如下:
判断 “存在连续天数” 的处理
最近遇到一个问题, 说某个打卡的系统, 要打卡以后, 判断是否存在 连续7天打卡。
例如 2012年1月7日 打卡了, 那么去检查 2012年1月1日 至 2012年1月6日 是否都打了。
还存在这样的情况, 可能是 2012年1月4日 至 2012年1月6日都打了, 同时 2012年1月8日 至 2012年1月10日都打了。
新打一个 2012年1月7日的卡, 形成了一个 连续7日。 ( 2012年1月4日 -- 2012年1月10日 )
处理思路是:
1. 从打卡日, 一天一天向前递归,直到遇到 上限值(例如这里的7天), 或者遇到中断。
2. 从打卡日, 一天一天向后递归,直到遇到 上限值(例如这里的7天), 或者遇到中断。
3. 获取前面两个步骤所产生的: 向前递归的最小值, 与向后递归的最大值。 来计算, 打卡日作产生的 连续天数。
CREATE TABLE #t (
id INT identity(1,1),
test_date DATETIME
)
INSERT INTO #t
SELECT CONVERT(DATETIME, '20120101', 112) UNION ALL
SELECT CONVERT(DATETIME, '20120102', 112) UNION ALL
SELECT CONVERT(DATETIME, '20120103', 112) UNION ALL
SELECT CONVERT(DATETIME, '20120104', 112) UNION ALL
SELECT CONVERT(DATETIME, '20120105', 112) UNION ALL
SELECT CONVERT(DATETIME, '20120106', 112) UNION ALL
SELECT CONVERT(DATETIME, '20120107', 112) UNION ALL
SELECT CONVERT(DATETIME, '20120108', 112) UNION ALL
SELECT CONVERT(DATETIME, '20120110', 112) UNION ALL
SELECT CONVERT(DATETIME, '20120111', 112) UNION ALL
SELECT CONVERT(DATETIME, '20120112', 112) UNION ALL
SELECT CONVERT(DATETIME, '20120113', 112) UNION ALL
SELECT CONVERT(DATETIME, '20120114', 112) UNION ALL
SELECT CONVERT(DATETIME, '20120115', 112) UNION ALL
SELECT CONVERT(DATETIME, '20120116', 112) UNION ALL
SELECT CONVERT(DATETIME, '20120117', 112);
with currentDateCTE AS (
-- 当前天.
SELECT
*
FROM
#t
WHERE
test_date = CONVERT(DATETIME, '20120106', 112)
),
prevDateCTE AS (
-- 向前递归.
SELECT
*
FROM
currentDateCTE
UNION ALL
SELECT
prevTab.*
FROM
#t prevTab JOIN prevDateCTE
ON (prevTab.test_date = prevDateCTE.test_date - 1)
),
nextDateCTE AS (
-- 向后递归.
SELECT
*
FROM
currentDateCTE
UNION ALL
SELECT
prevTab.*
FROM
#t prevTab JOIN nextDateCTE
ON (prevTab.test_date = nextDateCTE.test_date + 1)
)
SELECT
(SELECT MIN(test_date) FROM prevDateCTE) AS [第一天],
(SELECT MAX(test_date) FROM nextDateCTE) AS [最后一天],
DATEDIFF (
dd,
(SELECT MIN(test_date) FROM prevDateCTE),
(SELECT MAX(test_date) FROM nextDateCTE)
) + 1 AS [存在的连续日期]
转载URL:http://hi.baidu.com/wangzhiqing999/item/2abb8bf3aeeb4a7d3c198b46
相关文章推荐
- MS-SQL中取用户连续签到的次数
- 连续签到和当天是否签到SQL
- MS SQL Server命令行添加用户
- Oracle取消用户连续登录失败次数限制
- MS SQL Server 数据库修复 未处理修复语句。数据库需处于单用户模式下。解决
- 在MS SQLSERVER中如何最快的速度清空所有用户表的数据
- sql语句整理1--统计当月签到次数最多
- sql 连续两个月活跃的用户
- MYSQL实现连续签到功能断签一天从头开始(sql语句)
- MS SQL Server 2014 中,新建登录用户,分配权限,并指定该用户的数据库
- [sql]MS-SQL2005服务器登录名、角色、数据库用户、角色、架构的关系
- 配置MS SQL Server用户权限
- 在MS SQLSERVER中如何最快的速度清空所有用户表的数据
- PL/SQL基础编程之(十)[SQL、EM创建用户、角色][授权、配置文件、限制登录次数锁定用户]
- 【转载】MS SQL server2000单用户模式
- MS SQL Server错误21002:[SQL-DMO]用户"xxx"已经存在 解决方法
- 对MS SQLSERVER出现无法删除用户的解决办法
- Oracle用户连续登录失败次数限制如何取消
- SQL计算某一值连续出现的最大次数
- MS SQL Server错误21002:[SQL-DMO]用户"xxx"已经存在