MS-SQL中取用户连续签到的次数
2013-05-29 15:56
393 查看
表结构如下:
每个用户每天只能签到一次
现在前面的需求是判断某个用户在某天是否是连续签到,使用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中取用户连续签到的次数
- MS SQL Server存储过程批量修改用户表所有者
- 在MS SQLSERVER中如何最快的速度清空所有用户表的数据
- 连续签到和当天是否签到SQL
- MS SQL Server错误21002:[SQL-DMO]用户"xxx"已经存在 解决方法
- MS SQL server 2005中查询某张表从30-40条数据,但主键ID不是连续的
- 获取MS SQL Server用户存储过程最近修改日期
- 转摘--MS SQL Server 2000 数据库使用备份还原造成的孤立用户和对象名‘xxx’无效的错误的解决办法
- MS SQL Server 2014 中,新建登录用户,分配权限,并指定该用户的数据库
- MS SQL Server 2000 数据库使用备份还原造成的孤立用户和对象名‘xxx’无效的错误的解决办法
- sql server 安装程序无法将用户NT AUTHORITY\SYSTEM添加到本地组SQLServer2005MSFTUSER$LRZ$MSSQLSERVER
- Oracle用户连续登录失败次数限制如何取消
- MS SQL2005中用户的禁用及恢复[MS-SQL]
- sql语句整理1--统计当月签到次数最多
- MYSQL实现连续签到功能断签一天从头开始(sql语句)
- 将MS SQL SERVER数据库运行在普通用户(独立用户)状态下的设置方法终结篇
- [sql]MS-SQL2005服务器登录名、角色、数据库用户、角色、架构的关系
- 转帖:MS SQL Server 2000 数据库使用备份还原造成的孤立用户和对象名‘xxx’无效的错误的解决办法
- ms sql server 创建用户
- PL/SQL基础编程之(十)[SQL、EM创建用户、角色][授权、配置文件、限制登录次数锁定用户]