22,210
社区成员
发帖
与我相关
我的任务
分享
--> 测试数据:[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
*/
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
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)
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
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)