Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 05/04/2011, 14h02   #1
Membre du Club
 
Avatar de gantec
 
Inscription : février 2007
Messages : 223
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 223
Points : 53
Points : 53
Par défaut SQL - système de timbrage

Bonjour,

comment peut-on faire afin de compter le nombre d'heures passé dans un endroit en SQL ?

Par exemple :

début matin : 2011-04-05 07:00:00
fin matin : 2011-04-05 12:35:56

début pm : 2011-04-05 14:02:35
fin pm : 2011-04-05 20:26:15

je pensais utiliser la fonction TIMEDIFF pour trouver la réponse mais ça me pose un problème à cause des enregistrements.

Faut-il que je fasse un DATEDIFF entre début matin et fin matin puis pareil pour l'après-midi ou je peux le faire pour toute la journée en une seule commande ?

Merci de votre aide
__________________
.:: GanTec ::.
Quand on espère rien de rien et qu'on gagne le paquet, ça c'est le destin
gantec est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2011, 15h46   #2
Membre Expert
 
Avatar de zoom61
 
Homme Vincent ...
Passionné d'informatique
Inscription : janvier 2005
Messages : 1 217
Détails du profil
Informations personnelles :
Nom : Homme Vincent ...
Âge : 39
Localisation : France, Haute Vienne (Limousin)

Informations professionnelles :
Activité : Passionné d'informatique
Secteur : Industrie

Informations forums :
Inscription : janvier 2005
Messages : 1 217
Points : 1 506
Points : 1 506
Envoyer un message via Yahoo à zoom61 Envoyer un message via Skype™ à zoom61
Salut,

Peux-tu donner plus de détails sur la structure des données ? Comment sont enregistrées tes données heure début / heure de fin ?
Et donner un détail des données en entrées et ce que tu souhaites en sortie ?
__________________
N'oubliez pas le Tag :

C'est en parvenant à nos fins par l'effort, en étant prêt à faire le sacrifice de profits immédiats en faveur du bien-être d'autrui à long terme, que nous parviendrons au bonheur caractérisé par la paix et le contentement authentique. [Dalaï Lama]
Je ne réponds pas aux messages privés s'ils sont liés à une question du forum

Mon site sur Developpez.com
zoom61 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2011, 16h01   #3
Membre du Club
 
Avatar de gantec
 
Inscription : février 2007
Messages : 223
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 223
Points : 53
Points : 53
OK c'est vrai que se serait plus simple, alors voilà la structure de ma base :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
 
ID     |          DATE_CK          | CODE     |   OP  |
=====================================
1      | 2010-01-01 07:32:56  |    35       |    0   |
2      | 2010-01-01 12:56:32  |    35       |    1   |
3      | 2010-01-01 07:30:50  |    20       |    0   |
4      | 2010-01-01 13:50:56  |    35       |    0   |
5      | 2010-01-01 12:00:02  |    20       |    1   |
6      | 2010-01-01 19:53:25  |    20       |    1   |
7      | 2010-01-01 13:15:00  |    20       |    0   |
8      | 2010-01-01 20:07:44  |    35       |    1   |
L'ID correspond à l'identifiant de l'enregistrement, DATE_CK correspond au timbrage effectué et le CODE correspond au numéro de participant et le OP correspond au sens (entrée ou sortie).

Donc dans la logique, chaque participant doit avoir 4 timbrages par jour (2entrées et 2sorties)...

S'il manque de l'info...redis moi !

merci
__________________
.:: GanTec ::.
Quand on espère rien de rien et qu'on gagne le paquet, ça c'est le destin
gantec est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2011, 17h03   #4
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 442
Points : 10 442
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Quel est votre SGBD ?
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2011, 17h05   #5
Membre du Club
 
Avatar de gantec
 
Inscription : février 2007
Messages : 223
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 223
Points : 53
Points : 53
je travail avec mysql server 5.1 !
__________________
.:: GanTec ::.
Quand on espère rien de rien et qu'on gagne le paquet, ça c'est le destin
gantec est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2011, 16h33   #6
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 998
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 998
Points : 18 262
Points : 18 262
Envoyer un message via MSN à CinePhil
Essaie ceci :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
SELECT t1.CODE, 
    t1.ID AS id_entree, 
    t1.DATE_CK AS date_ck_entree,
    t2.ID AS id_sortie,
    t2.DATE_CK AS date_ck_sortie,
    CASE
        WHEN t2.ID IS NOT NULL THEN TIMEDIFF(t1.DATE_CK, t2.DATE_CK)
        ELSE 0
    END AS temps_passe
FROM ta_table t1
LEFT OUTER JOIN ta_table t2 ON t2.CODE = t1.CODE
    AND t2.OP = 1
    AND t2.DATE_CK = 
    (
        SELECT MIN(DATE_CK)
        FROM ta_table t3
        WHERE t3.DATE_CK > t1.DATE_CK
            AND t3.CODE = t1.CODE
    )
WHERE t1.OP = 0
ORDER BY t1.CODE, t1.DATE_CK
Si ça fonctionne (pas sûr à cause du WHERE dans la sous requête qui compare avec la première table), tu devrais avoir toutes les périodes de présence.

Ensuite, si tu veux le total par personne, tu mets tout ça en sous-requête dans une requête GROUP BY :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
SELECT tmp.CODE, SUM(tmp.temps_passe) AS total_temps_passe
FROM 
(
    SELECT t1.CODE, 
        CASE
            WHEN t2.ID IS NOT NULL THEN TIMEDIFF(t1.DATE_CK, t2.DATE_CK)
            ELSE 0
        END AS temps_passe
    FROM ta_table t1
    LEFT OUTER JOIN ta_table t2 ON t2.CODE = t1.CODE
        AND t2.OP = 1
        AND t2.DATE_CK = 
        (
            SELECT MIN(DATE_CK)
            FROM ta_table t3
            WHERE t3.DATE_CK > t1.DATE_CK
                AND t3.CODE = t1.CODE
        )
    WHERE t1.OP = 0
) tmp
GROUP BY tmp.CODE
ORDER BY tmp.CODE
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/04/2011, 11h41   #7
Membre du Club
 
Avatar de gantec
 
Inscription : février 2007
Messages : 223
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 223
Points : 53
Points : 53
Merci pour ta réponse, Cela m'a mis sur la bonne voie. En fin de compte, j'ai fait le traitement par PHP...mais merci pour le code SQL.

Problème résolu !

A+
__________________
.:: GanTec ::.
Quand on espère rien de rien et qu'on gagne le paquet, ça c'est le destin
gantec est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h50.


 
 
 
 
Partenaires

Hébergement Web