Forum Clubic

Nombre de Retard

Salut tout le monde !!!
Je Suis en Stage et j’aimerais calculer le nombre de retards d’un employé
On ne prend en considération un retard que quand l’employé dépasse 8:15:00.
sachant que je dispose de la base de données suivante:

MAtricule | Nom | MaDate | Etat
---------------------------------------http://www.clubic.com/forum/img/previsualiser_on.gif
www.clubic.com…
1 | popo | 01/01/2001 08:00 | Entree
1 | popo | 01/01/2001 08:10 | Sortie
1 | popo | 01/01/2001 08:13 | Entree
2 | papa | 01/01/2001 08:15 | Entree
3 | pcpc | 01/01/2001 08:30 | Entree
1 | popo | 01/01/2001 12:00 | Sortie
2 | papa | 01/01/2001 13:00 | Sortie
3 | pcpc | 01/01/2001 13:15 | Sortie

P.S: Je travaille avec ASP.NET

voila la requete que j’ai pu faire donc si vous pouvez m’aider merci d’avance

SELECT DISTINCT MAtricule, Nom, MIN(CONVERT(datetime ,Madate, 108)) As [inf],
CONVERT(varchar(20), MaDate, 108) As [time],
FROM Matable

WHERE CONVERT(varchar, Madate, 103) = ‘02/01/2007’
AND readerdescription like ‘Entree’
GROUP BY MAtricule, Nom, Madate
HAVING (CONVERT(varchar(20), Madate, 108)) > ‘08:15:00.00’

ça marche mais le problème c’est qu’elle me retourne pour un employé tous les entrées apré 08h15, é moi je veux seulement le premier

fais un select avec juste matricule dans un premier temps
pour ressortir uniquement la date au plus tôt de chaque employé je pense qu’il faudra faire une requête imbriquée

une remarque non technique cependant en supposant que ton salarié pointe:
=> Il va pointer 4 fois: une fois le matin en entrée, une fois le midi en sortie, une autre fois le midi en entrée et une fois le soir en sortie
=> S’il oublie de pointer une fois, tu vas obtenir un décalage entre “Entrée” et “Sortie”
voilà pourquoi j’oublierai ce paramètre dans la requête à ta place

ai confondu éditer et citer, la réponse en dessous
Edité le 22/02/2008 à 10:00

Merci pour ton aide
mais j’ai pas bien compris…si tu peux bien préciser
merci encore


merci a toi aussi deltree

mais je travail sous Sql 2000
donc …il m’a donner cette erreur

Serveur : Msg 195, Niveau 15, État 10, Ligne 1
‘Time’ n’est pas un nom de fonction reconnu.

c pour ca que je fesai les conversaion a chak fois, je sais pas si il y’a des fonction existent

Au temps pour moi, sur SQL server, il n’y a pas de fonction date/time, donc tu es obligé d’utiliser les convert:


SELECT  MAtricule, Nom, MIN(CONVERT(datetime ,Madate, 108)) 

FROM Matable
WHERE CONVERT(varchar, Madate, 103) = '02/01/2007'
and (CONVERT(varchar(20), Madate, 108)) > '08:15:00.00'
AND readerdescription = 'Entree'
GROUP BY MAtricule, Nom

pas de having qui porte sur des condition après le groupement.
Le groupement “group by” ne doit porter que sur les colonnes en commun sur les résultats regroupés (+ les fonctions d’aggrégation min, max …).

si tu met la date ou l’heure dans le groupement, vur que c’est différent pour tout le monde, ça ne regroupe plus rien :wink:

d’autre part, on emploi distinct ou group by, mais pas les 2 à la fois.

l3aaaaazz deltree

enfin c’a marché !
Mercii bcp :smiley:

:jap:

Oui, il faut grouper par jour


SELECT  MAtricule, Nom, MIN(CONVERT(datetime ,Madate, 108)) , CONVERT(varchar, Madate, 103) as jour

FROM Matable
WHERE 
MONTH ( MaDate) = 1
and (CONVERT(varchar(20), Madate, 108)) > '08:15:00.00'
AND readerdescription = 'Entree'
GROUP BY MAtricule, Nom, CONVERT(varchar, Madate, 103)

encore * UN GRAAAAAAND MERCI A DELTREE … LE SAUVETEUR de cette discution :wink:


SELECT  MAtricule, Nom, MIN(CONVERT(datetime ,Madate, 108)) , CONVERT(varchar, Madate, 103) as jour

FROM Matable
WHERE 
MONTH ( MaDate) = 1
and (CONVERT(varchar(20), Madate, 108)) > '08:15:00.00'
AND readerdescription = 'Entree'
GROUP BY MAtricule, Nom, CONVERT(varchar, Madate, 103)

la requete retourne pour chaque jour le cumule du retard
moi je veux un champ pour le nombre de retard par mois et un champ pour le cumule general

dsl je suis un debutant ^^
j’ai fais dans un select apart

sum(CONVERT(datetime,(min(CONVERT(datetime ,Madate, 108))-‘08:15:00.00’ ), 108))
et voila l’erreur

Serveur : Msg 130, Niveau 15, État 1, Ligne 14
Impossible d’exécuter une fonction d’agrégation sur une expression comportant un agrégat ou une sous-requête.

Vraiment pas de quoi… (évite le majuscules :whistle: )

les fonctions d’aggrégation sont spéciales, on ne peut pas appeler une fonction d’aggrégation dans une autre, on n’en met qu’une (par colonne bien sûr)

La il faut passer par des requêtes imbriquées, ou utiliser le résultat dans un langage, (VB, PHP ou autre) qui fera tes totaux.


--éventuellement ajouter un calcul de somme des retards avec la différence , sum(CONVERT(datetime,heure, 108)-'08:15:00.00' ) 
select MAtricule, Nom , jour, count(*)  as nb from
(SELECT MAtricule, Nom, MIN(CONVERT(datetime ,Madate, 108)) as heure , CONVERT(varchar, Madate, 103) as jour

FROM Matable
WHERE 
MONTH ( MaDate) = 1
and (CONVERT(varchar(20), Madate, 108)) > '08:15:00.00'
AND readerdescription = 'Entree'
GROUP BY MAtricule, Nom, CONVERT(varchar, Madate, 103)
) retard
group by  MAtricule, Nom, jour

Edité le 25/02/2008 à 09:44

au debut, c’a me donné des erreurs, jusqu’a ce que j’ai groupé par Jour aussi
mais la requete m’a rien retourné :S,
seulment les noms des champs :frowning:

Qsq Je vais faire mntn ?

Oui, il faut grouper par jour aussi (corrigé)
j’ai mis month(MaDate)=1 pour sélectionner janvier, si tu enlève ça, ça te retournera toute l’année.
Je pense que tu n’a pas de données sur la sélection de janvier :wink:

siisiiii :smiley:
tous les enregisrement que j’en ai , ce sont a Janvier

-------------------------- --------------------------
je sais plus quoi te dire Deltree pour te remercié…vraiment u m’a trop aider

j’ai troouver une autre requete, je vais la poster demain inchalah, pour le bien de out le monde, et pour l’echange d’informations biensure

encor merci Deltree :slight_smile:

voila la Correction

select Matricule , Nom ,count(Matricule)as Nombre_Retard , sum(DATEPART (minute,convert(datetime,Durée))+ DATEPART (hour,convert(datetime,Durée))*60) as Cumule_Retard from (SELECT Matricule, Nom,(min(CONVERT(datetime ,MaDate, 108)))as entree, CONVERT(varchar(20),(min(CONVERT(datetime ,MaDate, 108))-'08:15:00.00' ), 108)as Durée , CONVERT(varchar, MaDate, 103) as jour FROM Matable WHERE MONTH (MaDate) = 1 and (CONVERT(varchar(20), MaDate, 108)) > '08:15:00.00' AND Etat like 'Entrer' GROUP BY Nom,Matricule, CONVERT(varchar, MaDate, 103)) as rr group by Matricule,Nom

Merci encore a Deltree


```

select Matricule , Nom ,count(Matricule)as Nombre_Retard , sum(DATEPART (minute,convert(datetime,Durée))+ DATEPART (hour,convert(datetime,Durée))*60) as Cumule_Retard
from (SELECT Matricule, Nom,(min(CONVERT(datetime ,MaDate, 108)))as entree, CONVERT(varchar(20),(min(CONVERT(datetime ,MaDate, 108))-‘08:15:00.00’ ), 108)as Durée ,
CONVERT(varchar, MaDate, 103) as jour
FROM Matable
WHERE MONTH (MaDate) = 1
and (CONVERT(varchar(20), MaDate, 108)) > ‘08:15:00.00’
AND Etat like ‘Entrer’
GROUP BY Nom,Matricule, CONVERT(varchar, MaDate, 103)) as rr
group by Matricule,Nom

et ça marche?
=> “Entrer” au lieu de “Entrée”???
accessoirement, relis ma remarque pratique, je ne ferais pas de filtre sur ce critère mais plutôt sur les horaires.