1

Я работаю в системе посещаемости, и ниже мои данные в базе данных SQL ServerПолучите Min In Time и Max out TIme. ФОМ о посещаемости в Sql Server

|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 OutTime и общее TotalTime от yourtable одного пользователя в сутки.

+0

Не думайте, что это правильно обрабатывает 4-ю строчку, так как «Min» checkin будет 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