2014-11-08 136 views
1

对不起,我是新来的SQL服务器世界选择SQL语句

这个检查时间表

select * from CHECKINOUT where USERID= 467 
and CHECKTIME>'2014-10-24 00:00:00:000' order by CHECKTIME 





    useid checktime 
    467 2014-10-24 02:18:20.000 
    467 2014-10-24 17:04:43.000 
    467 2014-10-25 02:31:40.000 
    467 2014-10-25 17:13:38.000 
    467 2014-10-25 20:59:10.000 
    467 2014-10-27 17:22:06.000 
    467 2014-10-28 02:55:57.000 
    467 2014-10-28 17:57:12.000 
    467 2014-10-29 02:36:30.000 
    467 2014-10-29 17:13:35.000 
    467 2014-10-30 02:35:47.000 
    467 2014-10-30 17:17:56.000 
    467 2014-10-31 03:02:50.000 
    467 2014-10-31 17:19:18.000 
    467 2014-11-01 02:42:18.000 
    467 2014-11-01 17:16:14.000 
    467 2014-11-02 02:44:00.000 
    467 2014-11-03 17:20:10.000 
    467 2014-11-04 02:38:57.000 
    467 2014-11-05 02:15:50.000 
    467 2014-11-05 17:14:25.000 

and i need the output like 



useid  checkin     checkout 
    467  2014-10-24 17:04:43.000 2014-10-25 02:31:40.000 
    467  2014-10-27 17:22:06.000 2014-10-28 02:55:57.000 
    467  2014-10-28 17:57:12.000 2014-10-29 02:36:30.000 

,如果没有检查出像2014年11月5日17:14:25.000放结帐零坦克寻求帮助

+1

什么是你所得到的错误? – Matt 2014-11-08 16:11:11

+0

您可以向我们展示表格结构(具有哪些数据类型的列)和一些示例数据,然后解释您要如何处理该数据(您试图实现的输出) – 2014-11-08 16:25:34

+0

存在语法错误在你的代码中'和Checkin = DATEPART(hh,[CHECKTIME])> = 17'这是不可能的。使用这段代码解释你想达到的目标。 – 2014-11-08 16:33:00

回答

0

不知道你的问题是什么,我认为这会得到你所需要的。

SELECT USERID, MIN(CHECKTIME) AS Checkin, MAX(CHECKTIME) AS Checkout 
FROM checkinout 
WHERE [CHECKTIME] > '2014-10-24' 
AND DATEPART(hh,MIN(CHECKTIME)) >= '17' 
AND DATEPART(hh,MIN(CHECKTIME)) <= '22' 
AND DATEPART(hh,MAX(CHECKTIME)) >= '17' 
AND DATEPART(hh,MAX(CHECKTIME)) <= '22'  
AND USERID = '467' 
ORDER BY Checkin 

如果你想为所有的用户不只是467

SELECT USERID, MIN(CHECKTIME) AS Checkin, MAX(CHECKTIME) AS Checkout 
FROM checkinout 
WHERE [CHECKTIME] > '2014-10-24' 
AND DATEPART(hh,MIN(CHECKTIME)) >= '17' 
AND DATEPART(hh,MIN(CHECKTIME)) <= '22' 
AND DATEPART(hh,MAX(CHECKTIME)) >= '17' 
AND DATEPART(hh,MAX(CHECKTIME)) <= '22'  
GROUP BY CHECKTIME, USERID 
ORDER BY Checkin 
+0

这段代码是否会无错地编译? – 2014-11-08 16:34:31

+0

分钟和最大给我的答案从同一日期和本声明指纹为夜班小鸡从17:00:00至22:00:00,并检查出下一个日期之间1:00:00至4 :00:00 – 2014-11-08 16:37:15

+0

并且checkin和checkout不是列名,它的checktime和checktime是checkout的结果 – 2014-11-08 16:40:42

0
SELECT USERID,MIN(checktime) AS InTime,MAX(checktime) AS OutTime 
    FROM checkinout 
where USERID=467 and CHECKTIME>'2014-10-24 00:00:00.000' 
     GROUP BY USERID,DATEDIFF(dd,0,DATEADD(hh,-4,checktime)) 
    HAVING MIN(checktime) <> MAX(checktime) 
    AND MAX(DATEADD(hh,-4,checktime))-DATEDIFF(dd,0,DATEADD(hh,-4,checktime)) > '22:00' 
    ORDER BY MIN(checktime)