Requete sur date début et fin

Eléphant du PHP | 440 Messages

28 mars 2017, 11:50

Bonjour,


J'ai une requete:

SELECT rhp.nom, rhp.prenom, rhps.date_debut, rhps.date_fin
FROM `rh_personnel_suivi` rhps
INNER JOIN concessions c ON c.id_concessions = rhps.id_concessions
INNER JOIN rh_personnel rhp ON rhp.id_rhp = rhps.id_rhp
WHERE rhps.id_concessions = '1'
ORDER BY rhps.id_rhp
LIMIT 0 , 30

qui liste tout les salariés d'une société.

Nom| Prenom|Date début|Date fin

Le problème c'est que les salariés on eu des évolutions dans la société. Exemple une secrétaire apparait dans la liste 3 fois
1er fois a son arrivée, 2ème changement de status,3ème encore une évolution, 4ème évolution (0000-00-00 signifie que la personne est toujours la

nom prenom date_debut date_fin
toto paul 2008-05-05 2015-02-28
toto paul 2015-03-01 2016-04-30
toto Paul 2016-05-01 2016-10-31
toto Paul 2016-11-01 0000-00-00
Comment je peut faire en SQL pour arriver à n'avoir qu'on ligne
toto Paul 2008-05-05 0000-00-00
Merci d'avance pour vos explications

guigui69

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

28 mars 2017, 12:00

salut,

tu ne devrait pas avoir de date avec des zéros, le champs doit être null.

pour répondre a ta question il te faut deux sous requête pour récupérer la date d'arrivée et la date de sortie (ou pas)

donc
select  min(date_debut) from rh_personnel_suivi where id_rhp = xxx -- doit provenir de la requête parente

select  max(date_fin) from rh_personnel_suivi where id_rhp = xxx -- doit provenir de la requête parente
Attention il y a un piège pour la sortie il faut voir pour prendre en compte le fait que tu peux avoir une date de sortie non indiquée. tu va gérer cela avec un if et peux être un subselect :)

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 440 Messages

28 mars 2017, 16:02

Je suis arrivée à faire cela:
SELECT rhps.id_rhp, rhp.nom, rhp.prenom, min( rhps.date_debut ) as date_debut , max(
CASE rhps.date_fin
WHEN '0000-00-00'
THEN '2099-12-31'
ELSE rhps.date_fin
END ) as date_fin,date_naissance,nom_nationalite,sexe
FROM `rh_personnel_suivi` rhps
INNER JOIN concessions c ON c.id_concessions = rhps.id_concessions
INNER JOIN rh_personnel rhp ON rhp.id_rhp = rhps.id_rhp
INNER JOIN rh_personnel_nationalite rhpn ON rhpn.id_rhpn = rhpn.id_rhpn
INNER JOIN rh_personnel_type_emploi rhpte on rhpte.id_rhpte=rhps.id_rhpte
WHERE rhps.id_concessions = '1'
GROUP BY rhps.id_rhp
ORDER BY min( rhps.date_debut )
LIMIT 0 , 30
Par contre je bloque sur un point j'arrive à avoir la plus petite date et la plus grande. Par contre dans la table "rh_personnel_suivi" j'ai champs avec l'échelon et le type emploi.

Je test déjà sur le type emploi, il me ressort le 1er Type Emploi mais pas le dernier donc je sais pas comment faire pour ressortir le dernier type emploi

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

28 mars 2017, 16:42

la tu sélectionne toutes les lignes de table auxquelles tu joins les autres tables donc forcément sur la première ligne tu va avoir le 1er type d'emploi.

c'est le problème de ta solution tu va avoir les informations pour chaque ligne d'une personne (du coup les dates min / max semble pas forcément une bonne idée).
si tu veux les infos courantes du personnel part de la table rh_personnel et ajoute les autres.
pour les informations spécifique comme les dates utilise un subselecou une UDF tu va simplfier ta requête pour avoir les mêmes données.


@+
Il en faut peu pour être heureux ......