2008-10-31 15 views
1

J'ai une requête où j'ai une colonne de date (heure) qui indique sur le moment de la fréquentation des personnes « IN » & « OUT » par cette seule colonneComment diviser la colonne de date et résumer

Mes requêtes sont: -

1) Comment obtenir la présence quotidienne de chaque employé 2) Comment venir à savoir si l'employé est présent à moins de 5 heures

S'il vous plaît laissez-moi savoir les requêtes dans le serveur SQL.

+0

Pourquoi avez-vous les deux fois dans une seule colonne? Quel est le format? – chills42

+0

Oui, besoin de connaître le format/type de données de la colonne 'temps' pour écrire la requête. –

+0

Que se passe-t-il s'il y a plus d'IN que d'OUT? – splattne

Répondre

0
select 
     datediff(minute, TimeFrom, TimeTo) as AttendedTimeInMinutes, 
     case when datediff(minute, sTimeFrom, sTimeTo) < 5 * 60 
     then 
      'less than 5 hours' 
     else '5 hours or more' 
     end 
    from YourTable 
+0

Cela fonctionnerait s'il y avait une colonne TimeFrom & TimeTo - mais la question indique qu'il s'agit d'une seule colonne. –

+0

@Ken G: ok vous avez raison - il doit donc y avoir une colonne "OUT" et "IN". – splattne

+0

Utilisez la fonction SUBSTR/SUBSTRING pour extraire les parties IN et OUT de la colonne. – dan04

0

Pour trouver la différence entre deux dates, vous pouvez utiliser les éléments suivants:

SELECT Datepart(hour, dateTimeEnd - dateTimeStart) 

La fonction DatePart renvoie une partie d'une variable de temps de date et la dateTimeEnd - dateTimeStart renvoie la différence entre deux dates une nouvelle DateTime

1

Vous devrez regrouper la requête par l'utilisateur et les éléments pour un jour donné, puis comparer les valeurs maximum et minimum, par exemple

declare @users table (
    UserId int, 
    DateColumn datetime 
) 

insert into @users values (1, '2008-10-31 15:15') 
insert into @users values (1, '2008-10-31 10:30') 
insert into @users values (1, '2008-10-30 16:15') 
insert into @users values (1, '2008-10-30 10:30') 

select 
    UserID 
    , cast(dt as datetime) dt 
    , [in] 
    , [out] 
    , case when datepart(hour, [out]-[in]) >= 5 then 'yes' else 'no' end [5Hours?], 
    , cast(datediff(minute, [in], [out]) as float)/60 [hours] 
from (
    select 
    UserID 
    , convert(varchar, DateColumn, 112) dt 
    , min(DateColumn) [in] 
    , max(DateColumn) [out] 
    from @users 
    group by 
    UserID, convert(varchar, DateColumn, 112) 
    ) a 
Questions connexes