求教SqlServer如何查询不同状态的同时间字段的实际差 2C

求教各位大佬,我现在要对一个签到表进行每个人的工作时间的统计,表如下

图片说明
其中sign_type (1234)分别代表上午签到和签退 下午签到和签退 四种标记

每次传入trainingid为条件,来查询这个人的总共工作时间,谢谢了

如果能考虑上漏签不算就更好了

sql

2个回答

给你讲讲我的思路,首先将传入的trainingid为条件,将这个表拆分成四个表,分别为上午签到表,上午签退表,下午签到表,下午签退表,然后分别查出上午的工作时间,下午的工作时间相加就能得到你要的结果。

你要考虑打表的时候
1.是否会重复的打几次(导致某一天有sign_type重复的数据 _)
2.是否会忘记打卡(导致缺少sign_type 某一个数据)

对于考虑一就该 获取时间最早的打卡记录
对于考虑二就该 用特定的时间长度来代替 比如上午给他算俩个小时

假如training_id为a123456a_ 时间是2017-09-19
现在求某个某一天的的工作时间(假设他这天不是当天:即这天已经过了24小时)

select count(time) alltime from
(
select (case max( a.creditcard_date)-min(a.creditcard_date) when 0 then 1/12 end)*24 /*...这里有未打卡处理...*/

time from
/*...数据表开始...*/
(select *
(select sign_type,creditcard_date from TABLE where
CONVERT(varchar(100), creditcard_date, 23)= '2017-09-19'
and training_id = 'a123456a') t
where not exists (select 1 from (select sign_type,creditcard_date
from TABLE where
CONVERT(varchar(100), creditcard_date, 23)= '2017-09-19'
and training_id = 'a123456a') b where b.sign_type = t.sign_type /*...这里有重复数据处理...*/
and creditcard_date > t.creditcard_date)) a

/*...数据表结束...*/
where sign_type in (1,2)

union all

select (case max( a.creditcard_date)-min(a.creditcard_date) when 0 then 1/12 end)*24

time from

/*...数据表开始...*/
(select *
(select sign_type,creditcard_date from TABLE where
CONVERT(varchar(100), creditcard_date, 23)= '2017-09-19'
and training_id = 'a123456a') t
where not exists (select 1 from (select sign_type,creditcard_date
from TABLE where
CONVERT(varchar(100), creditcard_date, 23)= '2017-09-19'
and training_id = 'a123456a') b where b.sign_type = t.sign_type
and creditcard_date > t.creditcard_date)) a

/*...数据表结束...*/

where sign_type in (3,4)

)_temp

m0_38093650
啊喵是我 没有拿到你的数据我也测试不了,按照你的意思肯可能这里除了问题,你先看懂这句select (case max( a.creditcard_date)-min(a.creditcard_date) when 0 then 1/12 end)*24在适当的修改
2 年多之前 回复
Dawn1124
Dawn1124 回复啊喵是他: 我试了上下两个子查询 都是空的 最里面的查询可以查到一个人一天的四条数据 但是总体不行
2 年多之前 回复
m0_38093650
啊喵是我 回复Dawn1124: 你从开始结束之间的sql查数据看看哪里没有查到数据,我刚刚稍微测试了可以用
2 年多之前 回复
Dawn1124
Dawn1124 十分感谢你的回答,可是我研究半天,把数据表开始这句话下面的from给补上后,两个time都是空的,查不出来啊
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问