如何这句合并的SQL

舍南舍北 2009-08-05 09:46:31
表的内容如下
卡号 工号 刷卡日期 刷卡时间 读卡机名称
20001 60001 2009-8-5 08:25:23 上班
20001 60001 2009-8-5 17:25:23 下班

要查询得到的结果
卡号 工号 上班时间 下班时间
20001 60001 2009-8-5 08:25 2009-8-5 17:25


...全文
113 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
舍南舍北 2009-08-05
  • 打赏
  • 举报
回复
早来的白班从8:00算,晚班从20:00算起,迟到的,倒数据到Excel时做备注。感谢大家,很久没来这里了,很热闹啊,谢谢了
sdhdy 2009-08-05
  • 打赏
  • 举报
回复
但是刷卡有可能多刷了一次,如何取?
华夏小卒 2009-08-05
  • 打赏
  • 举报
回复

select 卡号,工号,
[上班时间]=max(case when [读卡机名称]='上班' then 刷卡日期+' '+刷卡时间 end),
[下班时间]=max(case when [读卡机名称]='下班' then 刷卡日期+' '+刷卡时间 end)
from Tb
group by 卡号,工号

卡号 工号 上班时间 下班时间
----------- ----------- --------------------- ---------------------
20001 60001 2009-8-5 09:25:23 2009-8-5 17:25:23
20002 60002 2009-8-5 08:39:00 2009-8-5 17:55:43

(所影响的行数为 2 行)
舍南舍北 2009-08-05
  • 打赏
  • 举报
回复
同一天同一工号只有一次上下班,如果是夜班从20点开始,到第二天早上8点
jinjazz 2009-08-05
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 sdhdy 的回复:]
取最小时间还是最大时间,楼主应该给一个规则。
[/Quote]

按常理,上班取小,下班取大
sdhdy 2009-08-05
  • 打赏
  • 举报
回复
还要考虑到员工多刷卡的情况,早来的情况,迟到的情况。
sdhdy 2009-08-05
  • 打赏
  • 举报
回复
取最小时间还是最大时间,楼主应该给一个规则。
sdhdy 2009-08-05
  • 打赏
  • 举报
回复
select 卡号,工号,刷卡日期,
上班时间=min(convert(nvarchar(10),刷卡日期,120)+' '+刷卡时间),
下班时间=max(convert(nvarchar(10),刷卡日期,120)+' '+刷卡时间)
from tb
group by 卡号,工号,刷卡日期
华夏小卒 2009-08-05
  • 打赏
  • 举报
回复
楼上的速度都是贼快的啊。
SQL77 2009-08-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 htl258 的回复:]
同一天同一工号只有一次上下班还是有多次?
[/Quote]
正是,如果就一次,好说,

select 卡号 ,工号,刷卡日期,

MAX(case when 读卡机名称 ='上班' then CONVERT(VARCHAR(10),刷卡时间,120)+CONVERT(VARCHAR(5),刷卡时间,108) end) 上班时间,

max(case when 读卡机名称 ='下班' then CONVERT(VARCHAR(10),刷卡时间,120)+CONVERT(VARCHAR(5),刷卡时间,108)) 下班时间

from tb

group by 卡号 ,工号,刷卡日期
guguda2008 2009-08-05
  • 打赏
  • 举报
回复
LS全正解
--小F-- 2009-08-05
  • 打赏
  • 举报
回复

select
卡号,
工号,
max(case when 读卡机名称='上班 ' then convert(varchar(10),刷卡日期,120)+' '+刷卡时间 end) as 上班时间,
max(case when 读卡机名称='下班 ' then convert(varchar(10),刷卡日期,120)+' '+刷卡时间 end) as 下班时间

from
tb
group by
卡号,工号
xxmsuper 2009-08-05
  • 打赏
  • 举报
回复

selct A.卡号,A.工号,A.刷卡日期 上班时间,B.刷卡日期 下班时间
from tb A
inner join tb B
on A.卡号=B.卡号
and convert(char(8),A.刷卡日期,120)=convert(char(8),B.刷卡日期,120)
and A.刷卡日期<B.刷卡日期

htl258_Tony 2009-08-05
  • 打赏
  • 举报
回复

---------------------------------
-- Author: htl258(Tony)
-- Date : 2009-08-05 09:49:57
---------------------------------
--> 生成测试数据表:tb

If not object_id('[tb]') is null
Drop table [tb]
Go
Create table [tb]([卡号] int,[工号] int,[刷卡日期] varchar(10),[刷卡时间] varchar(10),[读卡机名称] nvarchar(2))
Insert tb
Select 20001,60001,'2009-8-5','08:25:23','上班' union all
Select 20001,60001,'2009-8-5','17:25:23','下班'
Go
--Select * from tb

-->SQL查询如下:
select 卡号,工号,
上班时间=max(case [读卡机名称] when '上班' then [刷卡日期]+' '+[刷卡时间] end),
下班时间=max(case [读卡机名称] when '下班' then [刷卡日期]+' '+[刷卡时间] end)
from tb
group by 卡号,工号
/*
卡号 工号 上班时间 下班时间
----------- ----------- --------------------- ---------------------
20001 60001 2009-8-5 08:25:23 2009-8-5 17:25:23


(1 行受影响)
*/
如果一次.
csdyyr 2009-08-05
  • 打赏
  • 举报
回复
select 卡号,
工号,
max(case when 读卡机名称='上班 ' then convert(nvarchar(10),刷卡日期,120)+' '+刷卡时间 end) as 上班时间,
max(case when 读卡机名称='下班 ' then convert(nvarchar(10),刷卡日期,120)+' '+刷卡时间 end) as 下班时间

from tb
group by 卡号,工号
jinjazz 2009-08-05
  • 打赏
  • 举报
回复
select 卡号 ,工号,刷卡日期,
min(case when 读卡机名称 ='上班' then 刷卡时间 else '23:59:59' end) 上班时间,
max(case when 读卡机名称 ='下班' then 刷卡时间 else '00:00:00' end) 下班时间
from tb
group by 卡号 ,工号,刷卡日期
htl258_Tony 2009-08-05
  • 打赏
  • 举报
回复
同一天同一工号只有一次上下班还是有多次?

34,575

社区成员

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

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