用 sqlserver 怎样查询出 数据表里 某月上班连续打卡15天的人

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用 sqlserver 怎样查询出 数据表里 某月上班连续打卡15天的人相关的知识,希望对你有一定的参考价值。

日期必须是连续的,中间断了一天一不算

以下以2013年11月为例
1、使用横向连接,以5天为例,简单但不易扩展
with data as ( select * from yourtable where date>='2013-11-01' and date<'2013-12-01')
select distinct name
from data t1 join data t2 on t1.name=t2.name and t1.date=t2.date+1
join data t3 on t2.name=t3.name and t2.date=t3.date+1
join data t4 on t3.name=t4.name and t3.date=t4.date+1
join data t5 on t4.name=t5.name and t4.date=t5.date+1
2、使用纵向分组统计
with t1(id,rq) as (
select distinct 人员, date from 表 where date>='2013-11-01' and date<'2013-12-01' ),
--t1求出指定月的人员编号及不同的打卡日期
t2 as (select s2.* from t1 s1 join t1 s2 on s1.id=s2.id and s1.rq=s2.rq-1),
--t2求出所有上一日也打过卡的日期
t3 as (select * from t1 except select * from t2),
--t3求出所有上一日未打过卡的日期
t as (
select id,rq,1 days from t3
union all
select t1.id,t1.rq,t.days+1 from t1 join t on t1.id=t.id and t1.rq=t.rq+1
)
--t4递归调用,每连续一日days+1,就是求每一打卡时间是连续的第几天
select id
from t
group by id
having max(days)>=5
order by id
以上就不删了,以下可以改短点吧
with t as (
select 人员 id, date rq, 1 days from 表 t1
where not exists(select * from 表 t2 where t2.date=t1.date-1)
union all
select t1.id,t1.rq,t.days+1 from 表 t1 join t on t1.id=t.id and t1.rq=t.rq+1

)
select id
from t
group by id
having max(days)>=5
order by id
参考技术A 这个功能数据库用SQL语句是实现不了的,建议把每个月的上班情况读出来,用编程语言通过编程判断。你的需求是属于业务逻辑功能,数据库实现不了这么复杂的功能。 参考技术B 假日算不算追问

额,这个不是重点吧,那就算连续5天的也可以~

追答

我觉得应该用假日表和考勤表关联查询,除非你公司没休假。。。

急急急!应用程序在sql server2005里执行的sql语句怎样查看!

我用的一个软件,准备自己参照他的数据库,再搞一个出来,
比如说,我在应用程序里点一个查询,对应的就要把该查询所执行的sql 语句 获取到,怎么办,在网上看了N多资料,愣是没找到,哎,
复制的别来,哎,各位大侠,回答的好 问题解决了再加分。。

首先你参照的软件用到的数据库SQL SERVER环境你有没有,如果有你可以监测SQL执行的情况,那样可以获取SQL执行的语句。不过现在很多程序都对SQL进行了封装,如果存储过程加密了,那还得费一翻功夫。追问

额,不是吧, 我看网上说有什么工具可以获取出来,就是不知道怎么弄。 哎。。。

追答

不需要第三方工具,只是要你知道那款软件的SQL环境,如果有那环境,你可以截获SQL执行情况。

追问

什么是环境,汗,我小白一个,买的碟子,数据库是自动安装的,环境可能不知道吧。哎

追答

你那款软件运行需要的环境呀,你当前能否运行那款软件,如果可以,那就可以通过SQL SERVER里面的监测功能,看当前正在执行什么SQL语句。

追问

对对对,就是监测功能,怎么用,我不知道。 我这是sql server 2005的。

追答

你以SA连接到数据库,然后到“管理”——“活动监视器”中可以看到当前SQL正在执行的情况。

参考技术A 1、你是想问在你点击完你做的“查询”按键后,它执行了那条查询语句吗?
如果是这样的话,方法比较多,比如:以java为例,在对应执行的语句后加一条输出log,形式如下->System.out.println("XXXXXX");当执行到时,会在控制台打出这个log

2、如果你是想在程序中在执行完查询后,别的地方能获取到这个查询语句,你可以将该查询语句用一个字符串装起来,查询完后,将这个字符串传给需要得到该字符串的地方即可

-------
不知道能不能解决你的问题,你可以先试试看追问

额,这应用程序是买的,没源码?我怎么看,汗死

追答

解铃还须系铃人啊,如果人家能把源码发给你,最好不过了……

它的数据库文件给你了吗?如果有数据库文件,你可以点击,比较,哪个字段的数据变化了,然后就是根据自己的数据库知识来猜这句该怎么写了... ...

话说这么做的工作量很大啊... ...

不好整啊,不好整啊....

追问

是啊,所以我才想把他的sql语句获取出来,方便啊

参考技术B 这个具体我没有操作过,只是一个建议,你可以实验一下.
方法就是先建立两个数据库之间的连接,就是一个数据库可以访问另一个数据的表,然后分别对数据库中的表建立增删改数据的触发器,使在本数据库上的修改操作同时在另一台数据库上执行.
这里我认为应该把一台设置为主数据库,接收所有的修改操作,另一台只处理用户的查询操作,防止两个服务器同时修改时的冲突.
参考技术C 可以在2005里的时间探查器中进行查找。工具—SQL Server Profiler 参考技术D 没理解你的意图追问

就是我要获取应用程序里在数据库里执行的sql 语句。

第5个回答  2011-08-08 获取语句没意义
有数据库,自己分析吧。追问

只能如此了,哎。。

以上是关于用 sqlserver 怎样查询出 数据表里 某月上班连续打卡15天的人的主要内容,如果未能解决你的问题,请参考以下文章

SqlServer数据库中,日期的模糊查询

急急急!应用程序在sql server2005里执行的sql语句怎样查看!

求助,SQlServer用外连接查询出未匹配的数据

怎样用sql语句在sqlserver建表 和插入数据~

SQL怎样用SQL语句备份一张数据表

怎样提高SQLSERVER的like查询速度?