选择 SQL 语句
Posted
技术标签:
【中文标题】选择 SQL 语句【英文标题】:select SQL statement 【发布时间】: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
不在表格中。那它是怎么进入输出的
【参考方案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)
【讨论】:
以上是关于选择 SQL 语句的主要内容,如果未能解决你的问题,请参考以下文章