1

Je travaille sur le système de présence, et au-dessous mes données dans la base de données du serveur SQLObtenez le minimum et le maximum de temps. Fom enregistrement de présence dans 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 

- Je veux la sortie comme

|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 avait une bonne réponse. ils avaient juste besoin de concaténer la date pour les heures d'enregistrement et de paiement – xQbert

+0

Comment avez-vous obtenu ces totaux? Utilisez-vous des valeurs symboliques? – gjfonte

+0

somme temps total. vous obtenez 10.646 ou là abouts. 10 heures. Prenez .646 * 60 et vous obtenez 38 à peu près. – xQbert

Répondre

2

En supposant que vous voulez ceux qui sont spécifiques formats pour les temps:

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); 

requête:

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 

résultats:

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

Vous étiez définitivement sur le bon chemin avant la réponse supprimée et la mise à jour semble bonne! – xQbert

+0

Merci. J'ai reculé quand j'ai remarqué que les formats n'allaient pas être ce qui était spécifié dans le résultat et que je voulais tester avant de restaurer. – SqlZim

+0

@xQbert Le lien d'accès dans votre profil a été supprimé :( – 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 

vous donnera le plus petit InTime, bigest OutTime et la TotalTime totale de yourtable par utilisateur et par jour.

+0

Ne pense pas que cela gère la 4ème ligne correctement que le "Min" checkin serait 02:52:38 et le temps total n'est pas en le bon format. – 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