如何查询代打卡嫌疑人清单

sun8330 2012-06-18 03:07:29
考勤系统原始打卡记录表结构如下:
WORKRECO (WKR_INCOD char(7) NOT NULL,--工号
WKR_DATTIM smalldatetime NOT NULL, --刷卡时间
WKR_CACS varchar(3) NOT NULL) --刷卡机器号

问题:如何查询两天以上(含两天),刷卡时间与刷卡机器号相同的员工,显示结果最好有如下栏位:

工号1,工号2,起始日期,截止日期
...全文
435 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
sun8330 2012-06-19
  • 打赏
  • 举报
回复
上面两位高手,我用的是sql2000,有些指令用不了,我还在测试,如果方便的话,能否改成sql2000的指令,方便我测试一下,谢谢!
  • 打赏
  • 举报
回复

--> 测试数据:[WORKRECO]
if object_id('[WORKRECO]') is not null
drop table [WORKRECO]
go
create table [WORKRECO](
[WKR_INCOD] varchar(5),
[WKR_DATTIM] datetime,
[WKR_CACS] varchar(3)
)
go
insert [WORKRECO]
select 'B0001','2012-06-01 07:58:00','001' union all
select 'B0002','2012-06-01 07:58:00','001' union all
select 'B0003','2012-06-01 07:50:00','001' union all
select 'B0001','2012-06-01 12:01:00','002' union all
select 'B0002','2012-06-01 12:01:00','002' union all
select 'B0003','2012-06-01 12:03:00','002' union all
select 'B0001','2012-06-01 13:29:00','002' union all
select 'B0002','2012-06-01 13:29:00','002' union all
select 'B0003','2012-06-01 13:28:00','001' union all
select 'B0001','2012-06-01 17:35:00','001' union all
select 'B0002','2012-06-01 17:35:00','001' union all
select 'B0003','2012-06-01 17:30:00','001' union all
select 'B0001','2012-06-02 07:58:00','001' union all
select 'B0002','2012-06-02 07:58:00','001' union all
select 'B0003','2012-06-02 07:50:00','001' union all
select 'B0001','2012-06-02 12:01:00','002' union all
select 'B0002','2012-06-02 12:01:00','002' union all
select 'B0003','2012-06-02 12:03:00','002' union all
select 'B0001','2012-06-02 13:29:00','002' union all
select 'B0002','2012-06-02 13:29:00','002' union all
select 'B0003','2012-06-02 13:28:00','001' union all
select 'B0001','2012-06-02 17:35:00','001' union all
select 'B0002','2012-06-02 17:35:00','001' union all
select 'B0003','2012-06-02 17:30:00','001' union all
select 'B0001','2012-06-03 07:58:00','001' union all
select 'B0002','2012-06-03 07:58:00','001' union all
select 'B0003','2012-06-03 07:50:00','001' union all
select 'B0001','2012-06-03 12:01:00','002' union all
select 'B0002','2012-06-03 12:01:00','002' union all
select 'B0003','2012-06-03 12:03:00','002' union all
select 'B0001','2012-06-03 13:29:00','002' union all
select 'B0002','2012-06-03 13:29:00','002' union all
select 'B0003','2012-06-03 13:28:00','001' union all
select 'B0001','2012-06-03 17:35:00','001' union all
select 'B0002','2012-06-03 17:35:00','001' union all
select 'B0003','2012-06-03 17:30:00','001'
go

--问题:如何查询两天以上(含两天),刷卡时间与刷卡机器号相同的员工,显示结果最好有如下栏位
;with t
as(
select
px=ROW_NUMBER()over(partition by [WKR_INCOD] order by [WKR_DATTIM]),
de=convert(varchar(10),dateadd(dd,-DENSE_RANK()over(partition by [WKR_INCOD] order by convert(varchar(10),[WKR_DATTIM],120)),[WKR_DATTIM]),120),
[WKR_INCOD],
[WKR_DATTIM],
[WKR_CACS]
from
[WORKRECO]
)
select distinct
case when a.WKR_INCOD<b.WKR_INCOD then a.WKR_INCOD else b.WKR_INCOD end as 工号一,
case when a.WKR_INCOD>b.WKR_INCOD then a.WKR_INCOD else b.WKR_INCOD end as 工号二,
convert(varchar(10),MIN(a.WKR_DATTIM),120) as 起始时间,
convert(varchar(10),MAX(b.WKR_DATTIM),120) as 结束时间
from
t a,t b
where
a.de=b.de
and a.px=b.px
and a.WKR_CACS=b.WKR_CACS
and a.WKR_INCOD<>b.WKR_INCOD
and a.WKR_DATTIM=b.WKR_DATTIM
group by
a.WKR_INCOD,b.WKR_INCOD,a.de
having
DATEDIFF(DD,MIN(a.WKR_DATTIM),MAX(b.WKR_DATTIM))>=2
/*
工号一 工号二 起始时间 结束时间
------------------------------------------------
B0001 B0002 2012-06-01 2012-06-03
*/



孤独加百列 2012-06-18
  • 打赏
  • 举报
回复
写死我了,希望你看得懂。。。

IF EXISTS (SELECT 1 FROM SYSOBJECTS WHERE name = 'WORKRECO')
BEGIN
DROP TABLE WORKRECO
END
GO
CREATE TABLE WORKRECO
(
WKR_INCOD char(7) NOT NULL,--工号
WKR_DATTIM smalldatetime NOT NULL, --刷卡时间
WKR_CACS varchar(3) NOT NULL
) --刷卡机器号
GO
INSERT INTO WORKRECO
SELECT 'B0001','2012-06-01 07:58:00','001' UNION
SELECT 'B0002','2012-06-01 07:58:00','001' UNION
SELECT 'B0003','2012-06-01 07:50:00','001' UNION
SELECT 'B0001','2012-06-01 12:01:00','002' UNION
SELECT 'B0002','2012-06-01 12:01:00','002' UNION
SELECT 'B0003','2012-06-01 12:03:00','002' UNION
SELECT 'B0001','2012-06-01 13:29:00','002' UNION
SELECT 'B0002','2012-06-01 13:29:00','002' UNION
SELECT 'B0003','2012-06-01 13:28:00','001' UNION
SELECT 'B0001','2012-06-01 17:35:00','001' UNION
SELECT 'B0002','2012-06-01 17:35:00','001' UNION
SELECT 'B0003','2012-06-01 17:30:00','001' UNION

SELECT 'B0001','2012-06-02 07:58:00','001' UNION
SELECT 'B0002','2012-06-02 07:58:00','001' UNION
SELECT 'B0003','2012-06-02 07:50:00','001' UNION
SELECT 'B0001','2012-06-02 12:01:00','002' UNION
SELECT 'B0002','2012-06-02 12:01:00','002' UNION
SELECT 'B0003','2012-06-02 12:03:00','002' UNION
SELECT 'B0001','2012-06-02 13:29:00','002' UNION
SELECT 'B0002','2012-06-02 13:29:00','002' UNION
SELECT 'B0003','2012-06-02 13:28:00','001' UNION
SELECT 'B0001','2012-06-02 17:35:00','001' UNION
SELECT 'B0002','2012-06-02 17:35:00','001' UNION
SELECT 'B0003','2012-06-02 17:30:00','001' UNION


SELECT 'B0001','2012-06-03 07:58:00','001' UNION
SELECT 'B0002','2012-06-03 07:58:00','001' UNION
SELECT 'B0003','2012-06-03 07:50:00','001' UNION
SELECT 'B0001','2012-06-03 12:01:00','002' UNION
SELECT 'B0002','2012-06-03 12:01:00','002' UNION
SELECT 'B0003','2012-06-03 12:03:00','002' UNION
SELECT 'B0001','2012-06-03 13:29:00','002' UNION
SELECT 'B0002','2012-06-03 13:29:00','002' UNION
SELECT 'B0003','2012-06-03 13:28:00','001' UNION
SELECT 'B0001','2012-06-03 17:35:00','001' UNION
SELECT 'B0002','2012-06-03 17:35:00','001' UNION
SELECT 'B0003','2012-06-03 17:30:00','001'
GO

WITH t AS
(SELECT WKR_INCOD,CONVERT(VARCHAR(10),WKR_DATTIM,23) AS date,COUNT(1) AS num
FROM WORKRECO AS A
WHERE EXISTS (SELECT 1 FROM WORKRECO AS B WHERE A.WKR_INCOD <> B.WKR_INCOD AND A.WKR_DATTIM = B.WKR_DATTIM AND A.WKR_CACS = B.WKR_CACS)
GROUP BY WKR_INCOD,CONVERT(VARCHAR(10),WKR_DATTIM,23)),
m AS
(
SELECT WKR_INCOD,CONVERT(VARCHAR(10),WKR_DATTIM,23) AS Date,COUNT(1) AS num
FROM WORKRECO AS A
GROUP BY WKR_INCOD,CONVERT(VARCHAR(10),WKR_DATTIM,23)),
n AS
(
SELECT A.WKR_INCOD AS AWKR_INCOD,B.WKR_INCOD AS BWKR_INCOD,A.date
FROM t AS A,m AS B
WHERE A.WKR_INCOD <> B.WKR_INCOD AND A.num = B.num AND A.date = B.Date AND B.WKR_INCOD IN (SELECT WKR_INCOD FROM t WHERE num = B.num AND t.date = B.Date)
),
x AS
(
SELECT AWKR_INCOD,BWKR_INCOD,MIN(date) AS BEGINDATE,MAX(date) AS ENDDATE,COUNT(1) AS num
FROM n
GROUP BY AWKR_INCOD,BWKR_INCOD
HAVING COUNT(1) > 1 AND DATEDIFF(DAY,MIN(date),MAX(date)) + 1 = COUNT(1)
)

SELECT DISTINCT CASE WHEN AWKR_INCOD < BWKR_INCOD THEN AWKR_INCOD
ELSE BWKR_INCOD END AS AWKR_INCOD,
CASE WHEN AWKR_INCOD < BWKR_INCOD THEN BWKR_INCOD
ELSE AWKR_INCOD END AS BWKR_INCOD,BEGINDATE,ENDDATE
FROM x

AWKR_INCOD BWKR_INCOD BEGINDATE ENDDATE
B0001 B0002 2012-06-01 2012-06-03

应该中间步骤可以合并的,酌情处理下吧。。。
sun8330 2012-06-18
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
假如有三个人是一样的你又怎么处理???
工号1,工号2,起始日期,截止日期
那么三哥一样的时候还有一个工号怎么办????
[/Quote]

你这个问题问得很有道理,我也想过,如果能用一个栏位的字符串也很好,这样就没有这个问题了,如果能输出这样的结果,也算ok,同样会给分,谢谢!
  • 打赏
  • 举报
回复
假如有三个人是一样的你又怎么处理???
工号1,工号2,起始日期,截止日期
那么三哥一样的时候还有一个工号怎么办????
sun8330 2012-06-18
  • 打赏
  • 举报
回复
考勤系统原始打卡记录表WORKRECO结构如下:
表名:WORKRECO
栏位说明:(WKR_INCOD char(7) NOT NULL,--工号
WKR_DATTIM smalldatetime NOT NULL, --刷卡时间
WKR_CACS varchar(3) NOT NULL) --刷卡机器号

问题:如何查询连续两天以上(含两天),刷卡时间与刷卡机器号相同的员工,显示结果最好有如下栏位:

工号1,工号2,起始日期,截止日期

测试数据:
B0001,2012-06-01 07:58:00,001
B0002,2012-06-01 07:58:00,001
B0003,2012-06-01 07:50:00,001
B0001,2012-06-01 12:01:00,002
B0002,2012-06-01 12:01:00,002
B0003,2012-06-01 12:03:00,002
B0001,2012-06-01 13:29:00,002
B0002,2012-06-01 13:29:00,002
B0003,2012-06-01 13:28:00,001
B0001,2012-06-01 17:35:00,001
B0002,2012-06-01 17:35:00,001
B0003,2012-06-01 17:30:00,001

B0001,2012-06-02 07:58:00,001
B0002,2012-06-02 07:58:00,001
B0003,2012-06-02 07:50:00,001
B0001,2012-06-02 12:01:00,002
B0002,2012-06-02 12:01:00,002
B0003,2012-06-02 12:03:00,002
B0001,2012-06-02 13:29:00,002
B0002,2012-06-02 13:29:00,002
B0003,2012-06-02 13:28:00,001
B0001,2012-06-02 17:35:00,001
B0002,2012-06-02 17:35:00,001
B0003,2012-06-02 17:30:00,001


B0001,2012-06-03 07:58:00,001
B0002,2012-06-03 07:58:00,001
B0003,2012-06-03 07:50:00,001
B0001,2012-06-03 12:01:00,002
B0002,2012-06-03 12:01:00,002
B0003,2012-06-03 12:03:00,002
B0001,2012-06-03 13:29:00,002
B0002,2012-06-03 13:29:00,002
B0003,2012-06-03 13:28:00,001
B0001,2012-06-03 17:35:00,001
B0002,2012-06-03 17:35:00,001
B0003,2012-06-03 17:30:00,001


记住,一定要连续,如果一天有一次不相同就不要抓

最后的查询结果应该是:
B0001 B0002 2012-06-01 2012-06-03
表示B0001与B0002在6/1号与6/3号三天的打卡一样

sun8330 2012-06-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
SQL code


select
*
from
tb t
where
exists(select 1 from tb where workeco<>t.workeco and WKR_CACS=t.WKR_CACS and datediff(dd,WKR_DATTIM,tWKR_DATTIM)>=2) and convert(varchar(10),WKR_DATTIM……
[/Quote]
逻辑明显不对,是要查询连续两天以上的打卡完全一样的员工,不是相差两天
--小F-- 2012-06-18
  • 打赏
  • 举报
回复
select
*
from
tb t
where
exists(select 1 from tb where workeco<>t.workeco and WKR_CACS=t.WKR_CACS and convert(varchar(10),WKR_DATTIM,108)=convert(varchar(10),t.WKR_DATTIM,108)
and
WKR_CACS in(select WKR_CACS from tb group by WKR_CACS having count(1)>1)
--小F-- 2012-06-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
SQL code

select
*
from
tb t
where
exists(select 1 from tb where workeco<>t.workeco and WKR_CACS=t.WKR_CACS and datediff(dd,WKR_DATTIM,tWKR_DATTIM)>=2) and convert(varchar(10),WKR_DATTIM,1……
[/Quote]

我错误的理解了两天以上。
  • 打赏
  • 举报
回复
给测试数据
昵称被占用了 2012-06-18
  • 打赏
  • 举报
回复
SELECT A.WORKRECO , B.WORKRECO,MIN (A.WKR_DATTIM),MAX(A.WKR_DATTIM)
FROM 考勤系统原始打卡记录表 A,考勤系统原始打卡记录表 B
WHERE A.WKR_DATTIM = B.WKR_DATTIM
AND A.WKR_CACS = B.WKR_CACS
AND A.WORKRECO < B.WORKRECO
GROUP BY A.WORKRECO , B.WORKRECO
HAVING COUNT(1) > 1
--小F-- 2012-06-18
  • 打赏
  • 举报
回复

select
*
from
tb t
where
exists(select 1 from tb where workeco<>t.workeco and WKR_CACS=t.WKR_CACS and datediff(dd,WKR_DATTIM,tWKR_DATTIM)>=2) and convert(varchar(10),WKR_DATTIM,108)=convert(varchar(10),t.WKR_DATTIM,108)

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧