1

我的工作考勤系统,以下是我在SQL Server数据库中的数据获取最小时间和最大时间。在SQL服务器FOM考勤记录

|EmpCode|Date  |WorkDate |CheckIn |CheckOut |TotalTime 
|143 |2017-02-13 |2017-02-13 |20:09:02 |22:38:50 |2.496666000 
|143 |2017-02-13 |2017-02-13 |22:59:19 |23:18:15 |0.315555000 
|143 |2017-02-13 |2017-02-13 |23:33:47 |05:04:24 |5.510277000 
|143 |2017-02-14 |2017-02-13 |02:52:38 |05:12:04 |2.323888000 
|143 |2017-02-14 |2017-02-14 |20:09:26 |21:59:27 |1.833611000 
|143 |2017-02-14 |2017-02-14 |22:30:10 |22:49:26 |0.321111000 
|143 |2017-02-15 |2017-02-14 |05:05:05 |05:08:13 |0.052222000 

- 我要像

|EmpCode|wrk  |InTime  |OutTime |TotalTime 
|143 |2017-02-13 |08:09:02 PM|05:12:04 AM|10:38:00 
|143 |2017-02-14 |08:09:26 PM|05:08:13 AM|02:12:00 
+0

SQLzim有一个很好的答案。他们只需要连接日期以进行签入和结帐时间 – xQbert

+0

你是如何得到这些总数的?你使用符号值吗?总计时间总计为 – gjfonte

+0

。你会得到10.646或约。 10是几个小时。采取.646 * 60,你大致得到38。 – xQbert

回答

2

输出假设你想那些特定格式倍:

rextester:http://rextester.com/FUW31296

create table t (
    EmpCode int 
    , Date datetime 
    , WorkDate datetime 
    , CheckIn datetime 
    , CheckOut datetime 
    , TotalTime decimal(19, 9)) 

insert into t values 
(143,'2017-02-13','2017-02-13','20:09:02','22:38:50',2.496666000) 
,(143,'2017-02-13','2017-02-13','22:59:19','23:18:15',0.315555000) 
,(143,'2017-02-13','2017-02-13','23:33:47','05:04:24',5.510277000) 
,(143,'2017-02-14','2017-02-13','02:52:38','05:12:04',2.323888000) 
,(143,'2017-02-14','2017-02-14','20:09:26','21:59:27',1.833611000) 
,(143,'2017-02-14','2017-02-14','22:30:10','22:49:26',0.321111000) 
,(143,'2017-02-15','2017-02-14','05:05:05','05:08:13',0.052222000); 

查询:

select 
    EmpCode 
    , wrk  = convert(varchar(10),WorkDate,120) 
    , InTime = format(cast(min(Date + CheckIn) as datetime), 'hh:mm:ss tt') 
    , OutTime = format(cast(max(Date + CheckOut) as datetime), 'hh:mm:ss tt') 
    , TotalTime = format(dateadd(minute,sum(TotalTime)*60,0), 'HH:mm:ss') 
from t 
group by 
    EmpCode 
    , WorkDate 

结果:

+---------+------------+-------------+-------------+-----------+ 
| EmpCode | wrk  | InTime | OutTime | TotalTime | 
+---------+------------+-------------+-------------+-----------+ 
|  143 | 2017-02-13 | 08:09:02 PM | 05:12:04 AM | 10:38:00 | 
|  143 | 2017-02-14 | 08:09:26 PM | 05:08:13 AM | 02:12:00 | 
+---------+------------+-------------+-------------+-----------+ 
+0

在删除答案和更新看起来不错之前,您绝对是在正确的路径上! – xQbert

+0

谢谢。当我注意到格式不会是结果中指定的格式,并希望在恢复之前进行测试时,我退出了。 – SqlZim

+0

@xQbert您的个人资料中的帖子链接已被删除:( – SqlZim

0
select EmpCode, WorkDate as wrk, min(InTime) as InTime, max(OutTime) as OutTime, Sum(TotalTime) as TotalTime 
from yourtable 
group by EmpCode, WorkDate 

会给你最小InTime,该bigest OutTimeyourtable每个用户每天的总TotalTime

+0

不要认为这会正确处理第4行,因为“Min”检入将是02:52:38且总时间不在正确的格式。 – xQbert

1
select * 
,  datediff(minute, first_in, last_out) as Totaltime 
from (
     select emp_reader_id 
     ,  min(case when Event_entry.event_entry_name = 'IN' then trnevents.DT end) as Intime 
     ,  max(case when Event_entry.event_entry_name = 'OUT' then trnevents.DT end) as Outtime 
     ,  cast(min(trnevents.DT) as date) as date 
     from trnevents inner join Event_entry on trnevents.EventCatId=Event_entry.EventCatId 
     group by 
       emp_reader_id 
     ,  cast(trnevents.DT as date) 
     ) as SubQueriesMustBeNamed 
相关问题