Hello forum !
Voilà mon problème du jour :
j'ai une table dans laquelle j'ai deux champs : une date et une observation.
Cette table est liée à d'autres tables, mais là n'est pas le propos. Ce qu'il faut savoir, c'est que lors de l'ajout d'un enregistrement dans l'une des tables liées à celle-ci, toutes les dates qui m'intéressent sont automatiquement insérées dans cette table. Un petit schéma éclaircira ça :
Une table agent, et lorsqu'on y ajoute un enregistrement, la table pointage est automatiquement nourrie avec tous les jours pour lesquels cet agent est susceptible de pointer. Jusque là, rien d'exceptionnel.
Là où je veux en venir, c'est qu'un agent peut renseigner toute une période de congés, par exemple. Dans l'application associée à cette base de données, il saisit la date de début et la date de fin de la période. Ca se traduit par un "update pointage set observation = 'Congé' where date_pointage between [date_deb] and [date_fin];".
Jusque là, tout va bien.
Ce que je voudrais obtenir, maintenant, c'est le pendant de cet update : savoir d'après la table pointage les périodes (date de début et de fin, donc) renseignées comme période de congé. Et là, je sèche. Alors si une bonne âme a une solution à ce problème, je suis preneur.
Pour information, c'est une base qui tourne sous postgreSQL v8, et comme j'en suis le DBA, j'ai toute latitude pour ajouter ce que je veux à mes bases (types, opérateurs, fonctions, langages, etc).
Merci de votre attention, en espérant avoir été assez clair.
# hmmm
Posté par Hardy Damien . Évalué à 3.
from pointage
where
agent = [num]
observation = 'Congé' and
not exists (select * from pointage where observation <> 'Congé' and date_pointage between d1 and d2)
je n'ai pas testé et j'ai un doute sur le d1 et d2 de la fin mais si ca passe pourquoi pas.
Dam
[^] # Re: hmmm
Posté par Gyro Gearllose . Évalué à 2.
Pour clarifier la situation, et expliquer la structure de la table incriminée, voici un exemple :
Dans ma table ne figurent pour chaque agent que chaque jour considéré comme ouvré. Comprendre par là que ça court du lundi au samedi matin inclus.
Donc, je peux très bien avoir ce cas de figure :
01/09/2005 ; 'Aucune'
02/09/2005 ; 'Aucune'
03/09/2005 ; 'Aucune'
05/09/2005 ; 'Congé'
06/09/2005 ; 'Congé'
....
26/09/2005 ; 'Congé'
27/09/2005 ; 'Aucune'
.....
24/12/2005' ; 'Aucune'
26/12/2005' ; 'Congé'
...
03/01/2006 ; 'Congé'
04/01/2006 ; 'Aucune'.
Les ... remplacent des dates pour lesquelles les observations sont les mêmes que celle qui suivent ou précèdent.
Je voudrais récupérer :
05/09/2005 à 26/09/2005 -> Congé
26/12/2005 à 03/01/2006 -> Congé.
Le reste m'importe peu (encore que si on peut faire l'un, on peut faire l'autre).
Voilà, j'espère que c'est plus clair.
Et puis, surtout merci de t'intéresser à mon problème !
[^] # Re: hmmm
Posté par Dabowl_94 . Évalué à 2.
SELECT MIN(D1.date_pointage), MAX(D2.date_pointage)
FROM pointage D1, pointage D2
WHERE
agent = numAgent
AND
observation = Congé
AND
NOT EXISTS (SELECT * from pointage where observation <> 'Congé' and date_pointage between d1 and d2);
bloub° bloub°
dabowl_75
# un debut de quelque chose
Posté par Hardy Damien . Évalué à 2.
il y a une vue p (pour que les rownum soit cohérant avec le temps)
create view p as select * from pointage order by date_pointage;
select * from
(select rownum id, p.*
from p) t1,
(select rownum id, p.*
from p) t2,
(select rownum id, p.*
from p) t3
where t1.id = t2.id(+)-1 and t1.id = t3.id(+) + 1 AND (t1.observation <> t2.observation or t1.observation <> t3.observation) and t1.observation = 'Congés';
Avec ça tu as une ligne pour un début de congés, unligne pour une find e congé, un ligen pour un début de congés ...
le probleme se pose si on commence par un congé mais sinon ca passe :)
Dam
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.