【问题标题】:select SQL statement选择 SQL 语句
【发布时间】:2014-11-08 16:10:23
【问题描述】:

对不起,我是 SQL Server 世界的新手

这是检查时间表

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-05 17:14:25.000 这样的结帐,请将结帐空罐子寻求帮助

【问题讨论】:

  • 您遇到的错误是什么?
  • 您能否向我们展示一下表结构(哪些列具有哪些数据类型)和一些示例数据,然后解释您要对这些数据做什么(您要实现什么输出)
  • 您的代码AND Checkin = DATEPART(hh,[CHECKTIME]) >= 17 中存在语法错误,这是不可能的。说明您要使用此代码实现的目标。
  • 签入和签出不是列名,其签入时间为签入,签出时间为签出–
  • 此日期2014-10-27 17:22:06.000 不在表格中。那它是怎么进入输出的

标签: sql sql-server select


【解决方案1】:

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

 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

【讨论】:

  • min 和 max 给我同一日期的答案和这个声明,以便在 17:00:00 到 22:00:00 之间为夜班小鸡输入指纹并在下一个日期之间退房1:00:00 和 4:00:00
  • 并且签入和签出不是列名,其签入时间为签入,签出时间为签出
  • 即使现在第一个查询也不会编译老兄!!
  • 在第一个查询中,选择有 3 列,其中 USERID 没有包裹在 aggregate 中,所以 group by 在哪里
  • @Pradeep 这张桌子是用于指纹机的,这个用户在下午 5 点到凌晨 2 点之间轮班,我需要的是签入和签出表签出,仅此而已
【解决方案2】:
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) 

【讨论】:

    猜你喜欢
    • 2011-06-09
    • 1970-01-01
    • 2017-05-29
    • 2017-08-22
    • 2012-05-05
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    相关资源
    最近更新 更多