IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes et SQL. Discussion :

calcul durée de prestation


Sujet :

Requêtes et SQL.

  1. #21
    Membre régulier
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Juin 2015
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Juin 2015
    Messages : 288
    Points : 87
    Points
    87
    Par défaut
    Merci !!!

    bon, je laisse tomber la durée en mois ; en jours, cela ira très bien !

    c'est sur reqDuree2 que je bloque, car je suis ok pour utiliser les fonctions Min et Max si on a écart < 30 jours pour un même prestataire
    --> dans le cas contraire, il ne faut plus ajouter la durée de la prestation suivante aux précédentes : on repart à 0, on considère que c'est un nouvel ensemble de prestations qui commence.

    Je pense qu'il faut distinguer durée de prestation de écart entre prestation, pour pouvoir faire un iif sur l'écart et non la durée, genre :
    "si écart < 1 mois, alors DernPresta = Max(DateSuivante), sinon DernPresta = DateSuivante précédente"

    Ex : sur l'ensemble des prestations réalisées par "XBKT8156", reqDuree1 nous donne :

    Nom : reqDuree1_SAK.JPG
Affichages : 96
Taille : 35,2 Ko

    il faudrait que reqDuree2 sorte un tableau avec comme colonnes :
    - CUID,
    - nom
    - prénom,
    - date début "de présence dans notre société" = date début de la 1ère prestation indépendante
    - date fin "de présence dans notre société" = date du jour ou "date fin dernière prestation" ("dernière" ie. de l'ensemble des prestations qui s'enchainent, c-a-d qui ont un "écart" < 1 mois)
    - durée totale (mois ou jours)
    - carence (mois ou jours) = 30% x durée
    - date retour possible = date fin "de présence dans notre société" + carence

    mais avec 2 lignes pour "XBKT8156", soit un tableau ressemblant à :

    Nom : reqDuree2_SAK.JPG
Affichages : 97
Taille : 23,5 Ko

    --> il manque donc une fonction iif quelque part sur l'écart,
    --> c'est pour ça que je pense qu'il faut distinguer durée de prestation de écart entre prestation, pour pouvoir faire le iif sur l'écart et non la durée, genre :
    "si écart < 30 jours, alors DernPresta = Max(DateSuivante), sinon DernPresta = DateSuivante précédente"

    --> y a-t-il moyen d’avoir durée et écart dans un même tableau ?
    A moins que vous n'ayez une autre façon de réaliser cela ?

    bien cordt
    Images attachées Images attachées   

  2. #22
    Membre régulier
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Juin 2015
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Juin 2015
    Messages : 288
    Points : 87
    Points
    87
    Par défaut
    bonsoir,

    j'essaye d'avancer par moi-meme, mais bon...

    suite à mon post d'hier, mon idée est d'avoir 1 colonne "durée" et une autre "écart" dans une meme table. J'ai les 2 champs dans 2 tables différentes, mais je n'ai rien trouvé de probant sur le forum avec les mots clés "ajouter champ autre table"

    j'ai essayé de voir si avec UNION je pouvais m'en sortir : de ce que j'ai compris, non, car il faut que les SELECT des 2 tables unifiées aient le meme nb de champs et les memes caractéristiques

    j'ai retrouvé une requête "reqDuree" avec :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT T_Prestation.ID_Prestation, [T_Personne].[Nom_Personne] & " " & [T_Personne].[Prénom_Personne] AS [Nom Prenom], T_Prestation.Date_Début_Prestation, CDate(IIf([Date_Fin_Prestation] Is Null,Date(),[Date_Fin_Prestation])) AS date_completed, DateDiff("m",[Date_Début_Prestation],CDate(IIf([Date_Fin_Prestation] Is Null,Date(),[Date_Fin_Prestation]))) AS duree, [duree]/3 AS Carence, DateDiff("d",[Date_Début_Prestation],CDate(IIf([Date_Fin_Prestation] Is Null,Date(),[Date_Fin_Prestation]))) AS DureeJours, [DureeJours]/3 AS CarenceJours, Format(IIf(IsNull([T_Prestation].[Date_Fin_Prestation]),DateAdd("d",Date(),[CarenceJours]),""),"dd/mm/yyyy") AS DateRetour
    FROM T_Personne INNER JOIN T_Prestation ON T_Personne.CUID_Personne = T_Prestation.CUID_Prestation
    WHERE (((T_Personne.Nom_Personne & " " & T_Personne.Prénom_Personne) Not Like "*attente*") And ((T_Prestation.Date_Début_Prestation)<Date()) And ((T_Prestation.Statut_Personne)="externe"))
    ORDER BY [T_Personne].[Nom_Personne] & " " & [T_Personne].[Prénom_Personne], T_Prestation.Date_Début_Prestation;

    qui permet d'obtenir :

    Nom : reqDuree_AFI.JPG
Affichages : 95
Taille : 31,3 Ko

    et j'aimerais ajouter l'écart issu de reqDurée1 :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT T1.ID_Prestation, T1.CUID_Prestation, T1.Prestataire, T1.DatePresta, Min(T2.DatePresta) AS DateSuivante, DateDiff("d", T1.DatePresta, Min(T2.DatePresta)) AS EcartEnJrs
    FROM reqDuree AS T1 LEFT JOIN reqDuree AS T2 ON (T2.DatePresta > T1.DatePresta) AND (T1.CUID_Prestation = T2.CUID_Prestation)
    GROUP BY T1.CUID_Prestation, T1.Prestataire, T1.DatePresta, T1.ID_Prestation;

    qui donne :

    Nom : reqDuree1_AFI.JPG
Affichages : 90
Taille : 32,2 Ko

    , en faisant une correspondance sur ID_Prestation des 2 tables, et avec la condition "DatePresta = date_completed", mais je ne sais pas comment

    --> est-ce que la requête suivante est ok ???
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT T_Prestation.ID_Prestation, [T_Personne].[Nom_Personne] & " " & [T_Personne].[Prénom_Personne] AS [Nom Prenom], T_Prestation.Date_Début_Prestation, CDate(IIf([Date_Fin_Prestation] Is Null,Date(),[Date_Fin_Prestation])) AS date_completed, DateDiff("m",[Date_Début_Prestation],CDate(IIf([Date_Fin_Prestation] Is Null,Date(),[Date_Fin_Prestation]))) AS duree, [duree]/3 AS Carence, DateDiff("d",[Date_Début_Prestation],CDate(IIf([Date_Fin_Prestation] Is Null,Date(),[Date_Fin_Prestation]))) AS DureeJours, [DureeJours]/3 AS CarenceJours, Format(IIf(IsNull([T_Prestation].[Date_Fin_Prestation]),DateAdd("d",Date(),[CarenceJours]),""),"dd/mm/yyyy") AS DateRetour, [reqDuree1].EncartEnJrs
    FROM T_Personne INNER JOIN T_Prestation ON T_Personne.CUID_Personne = T_Prestation.CUID_Prestation, reqDuree1 INNER JOIN T_Prestation ON reqDuree1.CUID_Personne = T_Prestation.CUID_Prestation
    WHERE (((T_Personne.Nom_Personne & " " & T_Personne.Prénom_Personne) Not Like "*attente*") And ((T_Prestation.Date_Début_Prestation)<Date()) And ((T_Prestation.Statut_Personne)="externe")) AND (reqDuree1.ID_Prestation=reqDuree.ID_Prestation AND reqDuree1.DatePresta=reqDuree.date_completed),
    ORDER BY [T_Personne].[Nom_Personne] & " " & [T_Personne].[Prénom_Personne], T_Prestation.Date_Début_Prestation;

    EDIT 10/9/20 :
    --> NON : j'ai message "impossible de spécifier plusieurs fois le nom de la table "T_Prestation" dans la clause FROM"

    cordt

  3. #23
    Expert éminent Avatar de hyperion13
    Homme Profil pro
    Webplanneur
    Inscrit en
    Octobre 2007
    Messages
    4 273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Réunion

    Informations professionnelles :
    Activité : Webplanneur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 273
    Points : 6 582
    Points
    6 582
    Par défaut
    Salut
    En pj exemple de bdd qui devrait normalement répondre à la problématique.
    Il y a une proc dans le sform sur datedeb et datefin presta.
    Fichiers attachés Fichiers attachés

  4. #24
    Membre régulier
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Juin 2015
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Juin 2015
    Messages : 288
    Points : 87
    Points
    87
    Par défaut
    Bonjour,

    alors j'y suis arrivé d'une façon qui ressemble mais cependant différente, c-a-d en ajoutant une colonne "date de départ du Groupe" (ie. date de départ définitif) dans la tbl T_Prestation, et en imbriquant 3 niveaux de requêtes.

    Cela a été compliqué, je suis resté lgtps avec un DBA qui connaissait SQL mais pas Access, on a essayé d'adapter les requêtes postées ici, sans succès...
    je suis finalement reparti de 0 et cela a fonctionné - alors que j'écrivais la même chose...

    @Hyperion13 :
    vous avez proposé de renseigner les durées manuellement dans la tbl de départ, j'ai pas fait ça mais au final j'ai du qd meme modifier ma tbl...

    J'ai 2 dernières questions :
    1-j'ai du mettre dans toutes mes requêtes (cf. ci-dessous) un filtre sur l'utilisateur fictif "*attente*", sinon je le retrouvais dans tous mes résultats : le mettre uniquement dans ma 1ère requête ne suffisait pas - alors que les autres requêtes s'appuient sur son résultat
    --> pourquoi ?

    2- y aurait-il moyen de simplifier et supprimer 1 ou 2 niveaux d'imbrication de requête ???

    D'avance merci !



    Détails (pour ceux que cela intéresse) :
    1/je distingue donc "date fin prestation" et "date départ Groupe"
    (--> j'ai du màj toute la table manuellement)
    j'obtiens :
    Nom : T_Prestation_màj.JPG
Affichages : 40
Taille : 40,6 Ko

    on voit par exemple :
    - un interne qui est tjs là
    - un externe qui a enchainé 4 prestations et qui est là sur sa 4e
    - un externe qui a enchainé 2 prestations et qui est parti le 9/1/2019

    2/je crée une requête ReqDatesCompleted où je renseigne les dates vides :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT T_Prestation.ID_Prestation, [T_Personne].[Nom_Personne] & " " & [T_Personne].[Prénom_Personne] AS [Nom Prenom], T_Prestation.Date_Début_Prestation, CDate(IIf([Date_Fin_Prestation] Is Null,Date(),[Date_Fin_Prestation])) AS date_completed, CDate(IIf([Date_Depart_Groupe] Is Null,Format("01/01/1970","dd/mm/yyyy"),[Date_Depart_Groupe])) AS Date_Depart_Groupe_Completed
    FROM T_Personne INNER JOIN T_Prestation ON T_Personne.CUID_Personne = T_Prestation.CUID_Prestation
    WHERE (T_Personne.Nom_Personne & " " & T_Personne.Prénom_Personne) Not Like "*attente*" And T_Prestation.Statut_Personne="externe"
    ORDER BY [T_Personne].[Nom_Personne] & " " & [T_Personne].[Prénom_Personne], T_Prestation.Date_Début_Prestation;

    - si date_fin est vide, alors je prends al date du jour,
    - si date départ Gpe est vide, alors je prends la 1/1/1970
    - je filtre sur les externes uniquement
    - je ne prends pas l’utilisateur fictif contenant "attente"

    j'obtiens :
    Nom : reqdatescompleted.JPG
Affichages : 35
Taille : 32,1 Ko

    on voit par ex :
    - Siegfried a enchainé 3 prestations et est aprti le 30/6/2018
    - puis en a recommencé une le 23/4/2020 - et qu'il est tjs parmi nous
    - Zineb a commencé le 2/5/19 et est parti le 15/6/20

    (on ne retrouve pas les mêmes infos que précédemment car ici c'est trié sur le nom alors qu'avant c'était sur le CUID)

    3/je crée une requête ReqMaxDatesCompleted où je prends les Min/Max :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT [Nom Prenom], Min(Date_Début_Prestation) AS [Premiere Date], Max(Date_Début_Prestation) AS [Max Premiere Date], Max(date_completed) AS Max_Date_Fin_Completed, Max(Date_Depart_Groupe_Completed) AS [Max Date Départ Groupe]
    FROM reqDatesCompleted
    WHERE [Nom Prenom] Not Like "*attente*"
    GROUP BY [Nom Prenom]
    ORDER BY [Nom Prenom];

    - je prends la date début la + ancienne
    - la date de début la + récente,
    - la date de fin de prestation la + récente,
    - la date de départ du Groupe la + récente

    j'obtiens :
    Nom : reqmaxdatescompleted.JPG
Affichages : 39
Taille : 23,1 Ko

    4a/je crée une requête ReqMaxDatesCompletedFilteredRetour où je calcule la date de retour possible - uniquement si la personne est partie

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT [Nom Prenom], [Premiere Date], [Max Date Départ Groupe], DateDiff("d",[Premiere Date],[Max Date Départ Groupe]) AS DureeJours, Round([DureeJours]/3,0) AS CarenceJours, Format(DateAdd("d",[Max Date Départ Groupe],CarenceJours),"dd/mm/yyyy") AS [Date Retour Possible]
    FROM reqMaxDatesCompleted
    WHERE reqMaxDatesCompleted.[Max Premiere Date] < reqMaxDatesCompleted.[Max Date Départ Groupe]
    ORDER BY [Nom Prenom];

    - je ne prends que ceux qui sont partis avec "date de début la + récente" < "date de départ Groupe la + récente"
    - je prends la date de début la + ancienne,
    - la date de départ du Groupe la + récente,
    - je calcule le nb de jours entre les 2,
    - je calcule la carence = 30%
    - j'ajoute la carence à la date de départ du groupe la + récente pour avoir la date de retour possible

    j'obtiens :
    Nom : reqmaxdatescompletedfilteredretour.JPG
Affichages : 42
Taille : 18,1 Ko

    --> Zineb ne pourrait pas revenir avant le 30/10/2020

    4b/j'avais un autre besoin : celui de savoir depuis combien de temps sont chez nous les prestataires encore présents

    j'ai fait la requête :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT [Nom Prenom], [Max Premiere Date], DateDiff("d",[Max Premiere Date],Date()) AS DureeJours
    FROM reqMaxDatesCompleted
    WHERE reqMaxDatesCompleted.[Max Premiere Date] > reqMaxDatesCompleted.[Max Date Départ Groupe] AND [Nom Prenom] Not Like "*attente*"
    ORDER BY [Nom Prenom];

    et j'obtiens :
    Nom : reqmaxdatescompletedfilteredTLD.JPG
Affichages : 37
Taille : 13,4 Ko

    [/B]--> Siegfried est là depuis 151 jours[B]
    Images attachées Images attachées    

Discussions similaires

  1. calcul durée requête
    Par sergoid dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 19/02/2007, 16h17
  2. Calcul durée hors sam dim
    Par fab dans le forum Langage SQL
    Réponses: 4
    Dernier message: 16/01/2007, 22h28
  3. [SQL Server] Calcul durée entre 2 dates sans les dimanches
    Par sarahsonia dans le forum Langage SQL
    Réponses: 6
    Dernier message: 03/04/2006, 17h59
  4. calcul durée sur access
    Par juliette2 dans le forum Access
    Réponses: 2
    Dernier message: 23/11/2005, 13h56
  5. Calcul durée + Date : Erreur !
    Par priest69 dans le forum Access
    Réponses: 6
    Dernier message: 28/10/2005, 15h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo