2

Salut j'ai obtenir des données de l'appareil bio-métrique comme: -appareil d'enregistrement Bio-métrique

|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 

Je veux obtenir des données de dossier de tableau ci-dessus comme: -

|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: Le dupliquer IN ou OUT est ignoré.13, 14, 17 et 18 lignes dans les données brutes. 2. Les minutes sont en point décimal à l'heure dans le calcul des heures.

J'ai besoin de l'aide de la requête Sql-Server pour obtenir ces résultats.

Mon code actuel me permet pas et laisser aussi quelques lignes et obtenir un résultat erroné et total d'heures merci :)

Note: - Quand mon excute de requête manquant deux lignes: -

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

Eh bien, ce semble familier que ... http: //stackoverflow.com/questions/42253727/attendance-record-from-bio-metric-device –

+0

double possible de [document de présence du dispositif bio-métrique] (http : //stackoverflow.com/questions/42253727/attendance-record-from-bio-metric-device) – andrews

+0

pourquoi avez-vous posté la deuxième question identique pendant une période de 6 heures? Attendez la bonne réponse à votre question initiale. – andrews

Répondre

3

En supposant que 0 dans In et 1 est Out.

J'ai inclus une colonne Overnight pour renvoyer 1 lorsque CheckOut est le jour suivant. Vous pouvez le commenter si vous n'en avez pas besoin.

utilisant 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 

retours:

+---------+------------+-----------+----------+----------+------------+ 
| 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 | 
+---------+------------+-----------+----------+----------+------------+ 

Je ne vois pas 0InOutMode avant pour '2017-02-13 01:30:15', donc mes résultats ne contiennent pas une ligne pour :

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

Merci mais il manque quelques lignes de la requête ci-dessus: ( | 456 | 51 | 2017-02-13 01: 30: 15.000 | 1 | 463 | 51 | 2017-02-13 02: 52: 02.000 | 0 –

+0

et Overnight n'ont pas besoin de remerciements :) –

+1

@GoutamSingh comme je l'ai dit au bas de ma réponse, il n'y a pas de 'CheckIn' avant le 'CheckOut' de '2017-02-13 01: 30: 15 'Donc, il n'y aura pas de problème avec ça, et si vous regardez mes résultats, vous remarquerez que la première ligne est pour' CheckIn' de '2017- 02-13 02: 52: 02.000', donc il ne manque pas d'évidence, pourquoi ne regardes-tu pas tes exemples de données et tes résultats escomptés? On dirait que tu les écrases à chaque fois que tu poses une nouvelle question. réutiliser les identifiants avec des dates de travail différentes selon les questions et changer les dates de travail pour toutes les questions. son est évidemment pas un échantillon valide de ce que vous travaillez de – SqlZim