Re: [pgsql-fr-generale] SQL ou plpgsql pour recherche journée travail

From: Jean-Paul Argudo <jean-paul(at)argudo(dot)org>
To: Claude Castello <ccastello(at)athmo(dot)eu>
Cc: Liste PostgreSql <pgsql-fr-generale(at)postgresql(dot)org>
Subject: Re: [pgsql-fr-generale] SQL ou plpgsql pour recherche journée travail
Date: 2007-11-13 17:10:26
Message-ID: 4739DA82.70303@argudo.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-fr-generale

Bonsoir Claude,

Je n'ai pas bien compris votre problématique. Comme un exemple vaut
mieux qu'un long discours, je vous propose de nous faire un select *
from activite (en limitant par exemple à quelques cas "problématique")
et nous exposer ce que vous voulez en résultat.

J'ai néanmoins un petit truc à exposer, qui peut-être résoud votre
problème, mais comme je ne l'ai pas bien compris, je peux faire choux blanc!

Avec la fonction age() vous pouvez récupérer la durée d'une "journée"
(ou activité?) de travail. Il faudrait d'ailleurs adapter le
vocabulaire. On pourrait par exemple parler de la durée d'un "poste" ou
d'une "période de travail".

J'ai considéré que les activités étaient unitaires (puisqu'il y a une
séquence sur id_activité). Ce n'est peut être pas le cas. Peut-être
qu'une période est constituée de plusieurs activités?

> J'ai besoin de caractériser une activité au cours de la journée de
> travail. Pour cela, avant de me lancer dans des calculs "métier", je
> dois récupérer le début et la fin de la journée de travail sachant
> qu'une journée peut commencer à 22h et se terminer le lendemain à 6
> heures... Donc hors de question d'utiliser la date seulement.
> Pour simplifier un peu le problème, on peut considérer que les activités
> se suivent.

C'est là que je ne comprends pas.

Une journée de travail = plusieurs activités apparemment.

Cependant, il nous manque une table alors...

> J'ai écrit une procédure stockée qui va chercher l'activité précédente
> et l'activité suivante.Pour chacune de ses activités, je rappelle la
> même procédure stockée. Lorsque la procédure stockée ne trouve rien,
> j'ai obtenu le début et la fin de ma journée.
> C'est très, trop long !
> Pourriez-vous me guider un peu pour résoudre cette problématique
> relativement courante ?

Je veux bien. Mais il me faudrait plus d'éléments.

Par exemple, la table que vous décrivez ne suffit pas à elle seule à
faire cette fameuse boucle pour trouver toutes les activités d'une
"journée de travail".

Voici comment récupérer la durée d'une activité. C'est peut-être un
élément de réponse qui peut vous aider?

jpargudo=# select * from activite;
id_activite | debut | fin | type
-------------+---------------------+---------------------+------
1 | 2007-11-12 08:00:00 | 2007-11-12 18:00:00 | 1
2 | 2007-11-12 08:00:00 | 2007-11-12 12:00:00 | 2
3 | 2007-11-12 18:00:00 | 2007-11-13 01:00:00 | 1
(3 lignes)

jpargudo=# select id_activite, age(fin,debut), type from activite;
id_activite | age | type
-------------+----------+------
1 | 10:00:00 | 1
2 | 04:00:00 | 2
3 | 07:00:00 | 1
(3 lignes)

vous remarquerez que la fonction age() considère les écarts temporels
entre deux timestamps, quels qu'ils soient.

J'ai par la suite inventé le reste pour vous répondre:

J'ai supposé qu'il existait une table "travail" qui pour un salarié
répertorie toutes les activités à réaliser:

jpargudo=# select * from travail ;
id_salarie | id_activite
------------+-------------
1 | 2
1 | 3
(2 lignes)

Par jointure avec activités, et en recherchant la première date de début
et la dernière date de fin, permet de récupérer la date de début et de
fin de la journée. J'ai ajouté un age() entre les deux pour afficher le
temps écoulé entre le début de la première activité et la fin de la
dernière activité:

jpargudo=#
select min(debut) as debut_journee,
max(fin) as fin_journee,
age(max(fin),min(debut)) as duree
from activite a inner join travail t
using (id_activite)
where t.id_salarie=1;

debut_journee | fin_journee | duree
---------------------+---------------------+----------
2007-11-12 08:00:00 | 2007-11-13 01:00:00 | 17:00:00
(1 ligne)

Seulement, les min() max() vont provoquer des scans séquentiels?! Il
faudra alors créer des index..

Merci de me dire si j'ai approché votre problème, ou alors quel est-il
réellement...

Cordialement,

--
Jean-Paul Argudo
www.dalibo.com
www.postgresqlfr.org

In response to

Responses

Browse pgsql-fr-generale by date

  From Date Subject
Next Message Alain 2007-11-13 18:03:07 Re: SQL ou plpgsql pour recherche journée travail
Previous Message Claude Castello 2007-11-13 16:40:08 SQL ou plpgsql pour recherche journée travail