SQL 查询问题

fu0212 2017-09-11 08:21:38
现在有一张表 T

员工id 卡号 刷卡时间
0001 2345 2017-09-01 5:00:01
0002 2347 2017-09-01 5:03:01
0003 2349 2017-09-01 6:00:01
0004 2315 2017-09-01 8:00:01
0005 2362 2017-09-01 9:00:01
0006 2341 2017-09-01 9:01:01
0007 2377 2017-09-01 9:03:01

。。。。。。。。。。。。。。。
0006 2341 2017-09-01 15:00:01
0002 2347 2017-09-01 15:03:01
0001 2345 2017-09-01 16:00:01
0004 2315 2017-09-01 18:00:01
0005 2362 2017-09-01 19:00:01
0003 2341 2017-09-01 19:01:01
0007 2377 2017-09-01 19:03:01
。。。。。。。。。。。。。。。。

怎样可以批量查询出 每个卡号在 这一天最早和最晚的刷卡记录

原来是在程序中轮训 查找卡号 然后在找出这个卡号的最早和最晚记录
但由于人员太多 大概有6000人 要查询6000遍 导致程序非常慢

该如何写呢 最好是直接返回一张临时表里面

员工ID 卡号 最早时间 最晚时间 共工作了x小时
0001 2345 2017-09-01 5:00:01 2017-09-01 16:00:01 11
...全文
209 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
吉普赛的歌 版主 2017-09-11
  • 打赏
  • 举报
回复
引用 6 楼 qq_37170555 的回复:
[quote=引用 4 楼 yenange 的回复:]
刚发出来刷新了下界面就看到美女你的就出来了,。不过发现个问题,你的少了按每天的来分组[/quote] 确实, 你考虑得更周到
听雨停了 2017-09-11
  • 打赏
  • 举报
回复
引用 4 楼 yenange 的回复:
刚发出来刷新了下界面就看到美女你的就出来了,。不过发现个问题,你的少了按每天的来分组
听雨停了 2017-09-11
  • 打赏
  • 举报
回复

--测试数据
IF OBJECT_ID('#tab') IS NOT NULL
	DROP TABLE #tab
CREATE TABLE #tab(
	perID VARCHAR(20),
	cardID VARCHAR(20),
	dt DATETIME	
)
INSERT INTO #tab
select '0001','2345','2017-09-01 5:00:01'UNION ALL
select '0002','2347','2017-09-01 5:03:01'UNION ALL
select '0003','2349','2017-09-01 6:00:01'UNION ALL
select '0004','2315','2017-09-01 8:00:01'UNION ALL
select '0005','2362','2017-09-01 9:00:01'UNION ALL
select '0006','2341','2017-09-01 9:01:01'UNION ALL
select '0007','2377','2017-09-01 9:03:01'UNION ALL
select '0006','2341','2017-09-01 15:00:01'UNION ALL
select '0002','2347','2017-09-01 15:03:01'UNION ALL
select '0001','2345','2017-09-01 16:00:01'UNION ALL
select '0004','2315','2017-09-01 18:00:01'UNION ALL
select '0005','2362','2017-09-01 19:00:01'UNION ALL
select '0003','2341','2017-09-01 19:01:01'UNION ALL
select '0007','2377','2017-09-01 19:03:01'
--测试数据结束
SELECT perID,
       cardID,
       MIN(dt)                           AS 最早时间,
       MAX(dt)                           AS 最晚时间,
       DATEDIFF(hour, MIN(dt), MAX(dt))  AS 工作小时数
--INTO #tab--如果需要插入零时表       
FROM   #tab
GROUP BY
       perID,
       cardID,
       CONVERT(VARCHAR(100), dt, 23)

perID                cardID               最早时间                    最晚时间                    工作小时数
-------------------- -------------------- ----------------------- ----------------------- -----------
0001                 2345                 2017-09-01 05:00:01.000 2017-09-01 16:00:01.000 11
0002                 2347                 2017-09-01 05:03:01.000 2017-09-01 15:03:01.000 10
0003                 2341                 2017-09-01 19:01:01.000 2017-09-01 19:01:01.000 0
0003                 2349                 2017-09-01 06:00:01.000 2017-09-01 06:00:01.000 0
0004                 2315                 2017-09-01 08:00:01.000 2017-09-01 18:00:01.000 10
0005                 2362                 2017-09-01 09:00:01.000 2017-09-01 19:00:01.000 10
0006                 2341                 2017-09-01 09:01:01.000 2017-09-01 15:00:01.000 6
0007                 2377                 2017-09-01 09:03:01.000 2017-09-01 19:03:01.000 10

(8 行受影响)
吉普赛的歌 版主 2017-09-11
  • 打赏
  • 举报
回复
/* 测试数据开始 */
USE tempdb
GO
IF OBJECT_ID('t') IS NOT NULL DROP TABLE t
CREATE TABLE t(id VARCHAR(20),cardNo VARCHAR(30),d datetime)

INSERT INTO t(id,cardNo,d)
SELECT '0001','2345','2017-09-01 5:00:01'
UNION SELECT '0002','2347','2017-09-01 5:03:01'
UNION SELECT '0003','2349','2017-09-01 6:00:01'
UNION SELECT '0004','2315','2017-09-01 8:00:01'
UNION SELECT '0005','2362','2017-09-01 9:00:01'
UNION SELECT '0006','2341','2017-09-01 9:01:01'
UNION SELECT '0007','2377','2017-09-01 9:03:01'
UNION SELECT '0006','2341','2017-09-01 15:00:01'
UNION SELECT '0002','2347','2017-09-01 15:03:01'
UNION SELECT '0001','2345','2017-09-01 16:00:01'
UNION SELECT '0004','2315','2017-09-01 18:00:01'
UNION SELECT '0005','2362','2017-09-01 19:00:01'
UNION SELECT '0003','2341','2017-09-01 19:01:01'
UNION SELECT '0007','2377','2017-09-01 19:03:01'
/* 测试数据结束 */

SELECT id AS [员工ID]
,cardNo AS [卡号]
,MIN(d) AS [最早时间]
,MAX(d) AS [最晚时间]
,DATEDIFF(hour,MIN(d),MAX(d)) as [共工作了x小时]
FROM t
GROUP BY id,cardNo
ORDER BY id


fu0212 2017-09-11
  • 打赏
  • 举报
回复
引用 2 楼 RINK_1 的回复:

select 员工id,
       卡号,
       min(刷卡时间) as 最早时间,
       max(刷卡时间) as 最晚时间,
       datediff(hh,min(刷卡时间),max(刷卡时间)) as 工作时间长度
from table
group by 员工id,卡号,
谢谢 这样只能查询一个员工的数据 我希望是6000个员工 同时查询 不然我要执行这个6000遍 速度非常慢
RINK_1 2017-09-11
  • 打赏
  • 举报
回复

select 员工id,
       卡号,
       min(刷卡时间) as 最早时间,
       max(刷卡时间) as 最晚时间,
       datediff(hh,min(刷卡时间),max(刷卡时间)) as 工作时间长度
from table
group by 员工id,卡号,
fu0212 2017-09-11
  • 打赏
  • 举报
回复
用的编程语言是 VB6.0 或者C# 谢谢大家

34,591

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧