首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

怎么查询代打卡嫌疑人清单

2012-09-25 
如何查询代打卡嫌疑人清单考勤系统原始打卡记录表结构如下:WORKRECO (WKR_INCOD char(7)NOT NULL,--工号WK

如何查询代打卡嫌疑人清单
考勤系统原始打卡记录表结构如下:
WORKRECO (WKR_INCOD char(7) NOT NULL,--工号
WKR_DATTIM smalldatetime NOT NULL, --刷卡时间
WKR_CACS varchar(3) NOT NULL) --刷卡机器号

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

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

[解决办法]
写死我了,希望你看得懂。。。

SQL code
IF EXISTS (SELECT 1 FROM SYSOBJECTS WHERE name = 'WORKRECO')BEGIN    DROP TABLE WORKRECOENDGOCREATE TABLE WORKRECO (    WKR_INCOD char(7) NOT NULL,--工号    WKR_DATTIM smalldatetime NOT NULL, --刷卡时间    WKR_CACS varchar(3) NOT NULL) --刷卡机器号GOINSERT INTO WORKRECOSELECT 'B0001','2012-06-01 07:58:00','001' UNIONSELECT 'B0002','2012-06-01 07:58:00','001' UNIONSELECT 'B0003','2012-06-01 07:50:00','001' UNIONSELECT 'B0001','2012-06-01 12:01:00','002' UNIONSELECT 'B0002','2012-06-01 12:01:00','002' UNIONSELECT 'B0003','2012-06-01 12:03:00','002' UNIONSELECT 'B0001','2012-06-01 13:29:00','002' UNIONSELECT 'B0002','2012-06-01 13:29:00','002' UNIONSELECT 'B0003','2012-06-01 13:28:00','001' UNIONSELECT 'B0001','2012-06-01 17:35:00','001' UNIONSELECT 'B0002','2012-06-01 17:35:00','001' UNIONSELECT 'B0003','2012-06-01 17:30:00','001' UNIONSELECT 'B0001','2012-06-02 07:58:00','001' UNIONSELECT 'B0002','2012-06-02 07:58:00','001' UNIONSELECT 'B0003','2012-06-02 07:50:00','001' UNIONSELECT 'B0001','2012-06-02 12:01:00','002' UNIONSELECT 'B0002','2012-06-02 12:01:00','002' UNIONSELECT 'B0003','2012-06-02 12:03:00','002' UNIONSELECT 'B0001','2012-06-02 13:29:00','002' UNIONSELECT 'B0002','2012-06-02 13:29:00','002' UNIONSELECT 'B0003','2012-06-02 13:28:00','001' UNIONSELECT 'B0001','2012-06-02 17:35:00','001' UNIONSELECT 'B0002','2012-06-02 17:35:00','001' UNIONSELECT 'B0003','2012-06-02 17:30:00','001' UNIONSELECT 'B0001','2012-06-03 07:58:00','001' UNIONSELECT 'B0002','2012-06-03 07:58:00','001' UNIONSELECT 'B0003','2012-06-03 07:50:00','001' UNIONSELECT 'B0001','2012-06-03 12:01:00','002' UNIONSELECT 'B0002','2012-06-03 12:01:00','002' UNIONSELECT 'B0003','2012-06-03 12:03:00','002' UNIONSELECT 'B0001','2012-06-03 13:29:00','002' UNIONSELECT 'B0002','2012-06-03 13:29:00','002' UNIONSELECT 'B0003','2012-06-03 13:28:00','001' UNIONSELECT 'B0001','2012-06-03 17:35:00','001' UNIONSELECT 'B0002','2012-06-03 17:35:00','001' UNIONSELECT 'B0003','2012-06-03 17:30:00','001'GOWITH t AS(SELECT WKR_INCOD,CONVERT(VARCHAR(10),WKR_DATTIM,23) AS date,COUNT(1) AS numFROM WORKRECO AS AWHERE 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 numFROM WORKRECO AS AGROUP 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.dateFROM t AS A,m AS BWHERE 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 numFROM nGROUP BY AWKR_INCOD,BWKR_INCODHAVING 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,ENDDATEFROM xAWKR_INCOD    BWKR_INCOD    BEGINDATE    ENDDATEB0001      B0002      2012-06-01    2012-06-03
[解决办法]
SQL code
--> 测试数据:[WORKRECO]if object_id('[WORKRECO]') is not null drop table [WORKRECO]gocreate table [WORKRECO]([WKR_INCOD] varchar(5),[WKR_DATTIM] datetime,[WKR_CACS] varchar(3))goinsert [WORKRECO]select 'B0001','2012-06-01 07:58:00','001' union allselect 'B0002','2012-06-01 07:58:00','001' union allselect 'B0003','2012-06-01 07:50:00','001' union allselect 'B0001','2012-06-01 12:01:00','002' union allselect 'B0002','2012-06-01 12:01:00','002' union allselect 'B0003','2012-06-01 12:03:00','002' union allselect 'B0001','2012-06-01 13:29:00','002' union allselect 'B0002','2012-06-01 13:29:00','002' union allselect 'B0003','2012-06-01 13:28:00','001' union allselect 'B0001','2012-06-01 17:35:00','001' union allselect 'B0002','2012-06-01 17:35:00','001' union allselect 'B0003','2012-06-01 17:30:00','001' union allselect 'B0001','2012-06-02 07:58:00','001' union allselect 'B0002','2012-06-02 07:58:00','001' union allselect 'B0003','2012-06-02 07:50:00','001' union allselect 'B0001','2012-06-02 12:01:00','002' union allselect 'B0002','2012-06-02 12:01:00','002' union allselect 'B0003','2012-06-02 12:03:00','002' union allselect 'B0001','2012-06-02 13:29:00','002' union allselect 'B0002','2012-06-02 13:29:00','002' union allselect 'B0003','2012-06-02 13:28:00','001' union allselect 'B0001','2012-06-02 17:35:00','001' union allselect 'B0002','2012-06-02 17:35:00','001' union allselect 'B0003','2012-06-02 17:30:00','001' union allselect 'B0001','2012-06-03 07:58:00','001' union allselect 'B0002','2012-06-03 07:58:00','001' union allselect 'B0003','2012-06-03 07:50:00','001' union allselect 'B0001','2012-06-03 12:01:00','002' union allselect 'B0002','2012-06-03 12:01:00','002' union allselect 'B0003','2012-06-03 12:03:00','002' union allselect 'B0001','2012-06-03 13:29:00','002' union allselect 'B0002','2012-06-03 13:29:00','002' union allselect 'B0003','2012-06-03 13:28:00','001' union allselect 'B0001','2012-06-03 17:35:00','001' union allselect 'B0002','2012-06-03 17:35:00','001' union allselect 'B0003','2012-06-03 17:30:00','001'go--问题:如何查询两天以上(含两天),刷卡时间与刷卡机器号相同的员工,显示结果最好有如下栏位;with tas(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_DATTIMgroup by     a.WKR_INCOD,b.WKR_INCOD,a.dehaving    DATEDIFF(DD,MIN(a.WKR_DATTIM),MAX(b.WKR_DATTIM))>=2/*工号一    工号二    起始时间    结束时间------------------------------------------------B0001    B0002    2012-06-01    2012-06-03*/ 

热点排行
Bad Request.