2

Привет я получить данные из био-метрики устройства, как: -Bio-Metric устройство записи

|Id  |EmpCode | WorkDate     |InOutMode 
|247 |51   | 2017-02-13 20:08:52.000 |0   
|392 |51   | 2017-02-13 22:38:51.000 |1   
|405 |51   | 2017-02-13 22:59:18.000 |0   
|415 |51   | 2017-02-13 23:18:17.000 |1   
|423 |51   | 2017-02-13 23:33:44.000 |0   
|456 |51   | 2017-02-13 01:30:15.000 |1   
|463 |51   | 2017-02-13 02:52:02.000 |0   
|483 |51   | 2017-02-13 05:11:54.000 |1   
|1034 |51   | 2017-02-14 20:09:23.000 |0   
|1172 |51   | 2017-02-14 21:59:23.000 |1   
|1217 |51   | 2017-02-14 22:30:28.000 |0 
|1214 |51   | 2017-02-14 22:30:39.000 |0   
|1238 |51   | 2017-02-14 22:49:51.000 |1   
|1257 |51   | 2017-02-14 23:19:10.000 |0   
|1315 |51   | 2017-02-14 05:04:16.000 |1   
|1323 |51   | 2017-02-14 05:05:17.000 |0   
|1329 |51   | 2017-02-14 05:08:17.000 |1 
|1330 |51   | 2017-02-14 05:08:18.000 |1 

Я хочу, чтобы получить данные из выше записи таблицы, как: -

|EmpCode |WorkDate  |CheckIn |CheckOut |TotalHours 
|51  |2017-02-13  |20:08:52 |22:38:51 |2.499722000 
|51  |2017-02-13  |22:59:18 |23:18:17 |0.316388000 
|51  |2017-02-13  |23:33:44 |01:30:15 |3.103330000 
|51  |2017-02-13  |02:52:02 |05:11:54 |2.331111000 
|51  |2017-02-14  |20:09:23 |21:59:23 |1.833333000 
|51  |2017-02-14  |22:30:28 |22:49:51 |0.323055000 
|51  |2017-02-14  |23:19:10 |05:04:16 |5.323055000 
|51  |2017-02-14  |05:05:17 |05:08:18 |0.050000000 

PS: дублирование IN или OUT игнорируется.13, 14, 17 и 18 строками в исходных данных. 2. Минуты находятся в десятичной точке до часа в расчете часов.

Мне нужна помощь в запросе Sql-Server для получения этих результатов.

Мой текущий код не поможет мне, а также оставить несколько строк и получить неверный результат и в общей сложности часов благодаря :)

Примечание: - Когда мой запрос не хватает преобразования приложений в два ряда: -

|456 |51   | 2017-02-13 01:30:15.000 |1   
|463 |51   | 2017-02-13 02:52:02.000 |0 
+0

Ну, это наверняка выглядит знакомым ... http: //stackoverflow.com/questions/42253727/attendance-record-from-bio-metric-device –

+0

Возможный дубликат [Запись посещаемости с биометрического устройства] (http : //stackoverflow.com/questions/42253727/attendance-record-from-bio-metric-device) – andrews

+0

почему вы опубликовали второй идентичный вопрос в течение 6 часов? Дождитесь правильного ответа на ваш исходный вопрос. – andrews

ответ

3

Предполагая, что 0 in In и 1 is Out.

Я включил колонку Overnight, чтобы вернуть 1, когда CheckOut на следующий день. Вы можете прокомментировать это, если вам это не нужно.

использованием cross apply()

rextester: http://rextester.com/ENFRC28977

with cte as (
    select 
     Id 
    , EmpCode 
    , WorkDate 
    , InOutMode 
    , Lag_InOutMode = Lag(InOutMode) over (order by EmpCode, WorkDate) 
    from t 
) 
select 
    i.EmpCode 
    , WorkDate = convert(varchar(10),convert(date,i.WorkDate)) 
    , Overnight = case when datediff(day,i.WorkDate,o.WorkDate)>0 then 1 else 0 end 
    , CheckIn = convert(time,i.WorkDate) 
    , CheckOut = convert(time,o.WorkDate) 
    , TotalHours = datediff(second,i.WorkDate,o.WorkDate)/3600.0 
from cte i 
cross apply (
    select top 1 WorkDate 
    from cte o 
    where o.EmpCode = i.EmpCode 
     and o.InOutMode = 1 
     and o.Lag_InOutMode != 1 
     and o.WorkDate > i.WorkDate 
    order by o.WorkDate asc 
    ) as o 
where i.InOutMode = 0 
    and i.Lag_InOutMode != 0 
order by i.WorkDate 

возвращается:

+---------+------------+-----------+----------+----------+------------+ 
| EmpCode | WorkDate | Overnight | CheckIn | CheckOut | TotalHours | 
+---------+------------+-----------+----------+----------+------------+ 
|  51 | 2017-02-13 |   0 | 02:52:02 | 05:11:54 | 2,331111 | 
|  51 | 2017-02-13 |   0 | 20:08:52 | 22:38:51 | 2,499722 | 
|  51 | 2017-02-13 |   0 | 22:59:18 | 23:18:17 | 0,316388 | 
|  51 | 2017-02-13 |   1 | 23:33:44 | 05:04:16 | 5,508888 | 
|  51 | 2017-02-14 |   0 | 05:05:17 | 05:08:17 | 0,050000 | 
|  51 | 2017-02-14 |   0 | 20:09:23 | 21:59:23 | 1,833333 | 
|  51 | 2017-02-14 |   0 | 22:30:28 | 22:49:51 | 0,323055 | 
+---------+------------+-----------+----------+----------+------------+ 

Я не вижу 0InOutMode до для '2017-02-13 01:30:15', так что мои результаты не содержат строку для :

|51  |2017-02-13  |23:33:44 |01:30:15 |3.103330000 
+0

Спасибо, но пропустили несколько строк сверху запроса :( | 456 | 51 | 2017-02-13 01: 30: 15.000 | 1 | 463 | 51 | 2017-02-13 02: 52: 02.000 | 0 –

+0

и однодневная потребность в помощи спасибо :) –

+1

@GoutamSingh, как я сказал в нижней части моего ответа, нет 'CheckIn' до' CheckOut' из '2017-02-13 01: 30: 15'. Таким образом, не будет такой строки. Кроме того, если вы посмотрите на мои результаты, вы заметите, что первая строка для' CheckIn' '2017- 02-13 02: 52: 02.000', поэтому его явно не хватает. Почему бы вам не взглянуть на ваши данные примера и ожидаемые результаты еще раз? Похоже, вы просто затираете его каждый раз, когда задаете новый вопрос. повторно использовать идентификаторы с разными рабочими местами по всем вопросам и изменять рабочие вопросы по всем вопросам. его, очевидно, не является действительным образцом того, что вы работаете с – SqlZim

Смежные вопросы