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

MS SQL Server Discussion :

[MsSQL2005] récupération de période d'absence pour une période donnée


Sujet :

MS SQL Server

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 483
    Points : 309
    Points
    309
    Par défaut [MsSQL2005] récupération de période d'absence pour une période donnée
    Bonjour,

    Je bloque actuellement sur la manière de faire pour récupérer la liste des périodes d'absence d'un employé pour une période donnée :

    J'ai relevé différent cas :

    Soit :

    date_debut : debut de la période de recherche des périodes d'absence
    date_fin : fin de la période de recherche des périodes d'absence
    START_DATE : début de la période d'absence
    END_DATE : fin de la période d'absence

    1 er Cas :

    Ma periode de recherche est complètement comprise dans une periode d'absence :

    START_DATE < date_debut < date_fin< END_DATE

    2 Cas :

    Ma periode d'absence est complètement comprise dans une période de recherche :

    date_debut< START_DATE < END_DATE < date_fin

    3eme Cas :

    Ma periode d'absence commence dans la periode de recherche

    date_debut<START_DATE<date_fin< END_DATE

    4 eme Cas :

    Ma periode d'absence se termine dans une periode de recherche

    START_DATE<date_debut<END_DATE<date_fin


    Je ne sais pas déjà jusqu'ici si j'expose bien le problème ?

    Ensuite je ne vois pas bien comment exprimé la ou les requêtes pour extraire les différentes périodes d'absences.

    Je continue mes recherches, si vous avez des remarques je suis preneur

    Merci d'avance.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 483
    Points : 309
    Points
    309
    Par défaut
    Bonjour,

    Je viens de gérer le premier cas en fait il s'agit d'un cas assez rare et je bloquais dessus parce que je n'avais pas de résultat retourné :

    set ANSI_NULLS ON
    set QUOTED_IDENTIFIER ON
    GO
    -- =============================================
    -- Description: <Sélectionne la liste des absences en fonction de l'EMPLOYEE_KEY et de la periode de traitement>
    -- =============================================
    ALTER PROCEDURE [dbo].[PS_Select_Absence_fct_EmployeeKey_Periode]
    -- Add the parameters for the stored procedure here
    @date_debut as datetime,
    @date_fin as datetime,
    @EMPLOYEE_KEY int
    AS
    BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    SELECT
    EMPLOYEE_KEY,
    EMPLOYEE_SURNAME,
    EMPLOYEE_FIRST_NAME,
    ABSENCE_TYPE_ABBREVIATION,
    START_DATE,
    END_DATE,
    START_IN_THE_MORNING,
    ENDING_THE_AFTERNOON,
    DURATION_IN_DAYS,
    DURATION_IN_HOURS
    FROM ABSENCE_FILE
    WHERE EMPLOYEE_KEY = @EMPLOYEE_KEY
    -- cas ou la periode d'absence est comprise dans la periode de recherche
    AND START_DATE < @date_debut
    AND @date_fin < END_DATE

    ORDER BY END_DATE ASC

    END
    bon je continue

    ++

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 483
    Points : 309
    Points
    309
    Par défaut
    Bonjour,

    voici ma version traitant tous les cas de période d'absence :

    set ANSI_NULLS ON
    set QUOTED_IDENTIFIER ON
    GO
    -- =============================================
    -- Description: <Sélectionne la liste des absences en fonction de l'EMPLOYEE_KEY et de la periode de traitement>
    -- =============================================
    ALTER PROCEDURE [dbo].[PS_Select_Absence_fct_EmployeeKey_Periode]
    -- Add the parameters for the stored procedure here
    @date_debut as datetime,
    @date_fin as datetime,
    @EMPLOYEE_KEY int
    AS
    BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    -- cas ou la periode de recherche est comprise dans la periode d'absence
    SELECT
    EMPLOYEE_KEY,
    EMPLOYEE_SURNAME,
    EMPLOYEE_FIRST_NAME,
    ABSENCE_TYPE_ABBREVIATION,
    START_DATE,
    END_DATE,
    START_IN_THE_MORNING,
    ENDING_THE_AFTERNOON,
    DURATION_IN_DAYS,
    DURATION_IN_HOURS
    FROM dbo.ABSENCE_FILE
    WHERE EMPLOYEE_KEY = @EMPLOYEE_KEY
    AND START_DATE < @date_debut
    AND @date_fin < END_DATE

    UNION
    -- cas ou la periode d'absence est comprise dans la periode de recherche
    SELECT
    EMPLOYEE_KEY,
    EMPLOYEE_SURNAME,
    EMPLOYEE_FIRST_NAME,
    ABSENCE_TYPE_ABBREVIATION,
    START_DATE,
    END_DATE,
    START_IN_THE_MORNING,
    ENDING_THE_AFTERNOON,
    DURATION_IN_DAYS,
    DURATION_IN_HOURS
    FROM dbo.ABSENCE_FILE
    WHERE EMPLOYEE_KEY = @EMPLOYEE_KEY
    AND @date_debut < START_DATE
    AND END_DATE < @date_fin

    UNION
    -- cas ou les absences commencent pendant la période de recherche et se
    -- terminent après la periode de recherche
    SELECT
    EMPLOYEE_KEY,
    EMPLOYEE_SURNAME,
    EMPLOYEE_FIRST_NAME,
    ABSENCE_TYPE_ABBREVIATION,
    START_DATE,
    END_DATE,
    START_IN_THE_MORNING,
    ENDING_THE_AFTERNOON,
    DURATION_IN_DAYS,
    DURATION_IN_HOURS
    FROM dbo.ABSENCE_FILE
    WHERE EMPLOYEE_KEY = @EMPLOYEE_KEY
    AND @date_debut<START_DATE
    AND @date_fin<END_DATE
    AND START_DATE<@date_fin

    UNION
    -- cas ou les absences commencent avant la période de recherche et se
    -- terminent pendant la période de recherche
    SELECT
    EMPLOYEE_KEY,
    EMPLOYEE_SURNAME,
    EMPLOYEE_FIRST_NAME,
    ABSENCE_TYPE_ABBREVIATION,
    START_DATE,
    END_DATE,
    START_IN_THE_MORNING,
    ENDING_THE_AFTERNOON,
    DURATION_IN_DAYS,
    DURATION_IN_HOURS
    FROM dbo.ABSENCE_FILE
    WHERE EMPLOYEE_KEY = @EMPLOYEE_KEY
    AND @date_debut>START_DATE
    AND @date_debut<END_DATE
    AND END_DATE < @date_fin

    ORDER BY START_DATE ASC

    END
    Je voulais savoir si il y avait moyen de faire autrement qu'en utilisant un UNION?

    Je suis preneur de toute remarque

    ++

  4. #4
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Malheureusement le prédicat OVERLAPS() de la norme SQL n'est pas encore implémenté dans SQL Server.
    SQLPro propose ici un alternative

    @++

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 483
    Points : 309
    Points
    309
    Par défaut
    Bonjour,

    Merci pour le lien, exactement ce que je recherche .

    Encore merci pour le lien .

    J'ai essayer de retraduire les différents cas :

    START_DATE = P1_Debut = Début de la période d'absence
    END_DATE = P1_FIN = Fin de la période d'absence

    @date_debut = P2_Debut = Début de la période de recherche
    @date_fin = P2_Fin = Fin de la période de recherche


    (P1_DEBUT > P2_DEBUT AND (P1_DEBUT < P2_FIN OR P1_FIN < P2_FIN))

    traduit donne :

    (START_DATE > @date_debut AND(START_DATE < @date_fin OR END_DATE< @date_fin))

    et traduit les cas :

    - La période d'absence est complètement inclue dans la période de recherche.
    - La période d'absence commence dans la période de recherche et se termine après la période de recherche


    (P2_DEBUT > P1_DEBUT AND (P2_DEBUT < P1_FIN OR P2_FIN < P1_FIN))

    traduit donne

    (@date_debut > START_DATE AND (@date_debut < END_DATE OR @date_fin < END_DATE))

    et traduit le cas :

    - la période de recherche est complètement inclue dans la période d'absence



    Cependant je n'ai pas réussit à mettre en évidence le cas :

    - La période d'absence commence avant la période de recherche et se finit pendant la période de recherche

    A moins que je n'ai mal retraduit ou alors pas tout compris.

    Une chose est sur c que je n'ai pas compris la dernière expression :

    (P1_DEBUT = P2_DEBUT AND (P1_FIN IS NOT NULL AND P2_FIN IS NOT NULL))

    Si qqn peux m'expliquer je suis preneur.

    En tout cas merci pour le lien, dont l'article est très intéressant

    ++

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 483
    Points : 309
    Points
    309
    Par défaut
    Bonjour,

    Je viens de refaire quelque ligne de temps, et

    (@date_debut > START_DATE AND (@date_debut < END_DATE OR @date_fin < END_DATE))
    ce cas traduit :

    - la période de recherche est complètement inclue dans la période d'absence
    - la période d'absence commence avant la période de recherche et finit pendant la période de recherche.

    Je pense que cette expression :

    (P1_DEBUT = P2_DEBUT AND (P1_FIN IS NOT NULL AND P2_FIN IS NOT NULL))
    gère les cas ou les deux périodes commencent en même temps.

    Apparemment cette version gère donc bien tous les cas utiles.

    Je suis preneur de toutes remarques, ou idée

    Encore merci

    ++

Discussions similaires

  1. [CR XI] Calcul ne nombre de samedi et dimanche pour une période
    Par 007max31 dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 26/08/2009, 16h07
  2. Réponses: 2
    Dernier message: 10/06/2009, 10h59
  3. [CR 2008] Groupement pour une période
    Par campia dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 26/02/2009, 11h32
  4. faire une somme pour une période
    Par cdevl32 dans le forum Langage SQL
    Réponses: 14
    Dernier message: 18/03/2008, 15h26
  5. [CR] Filtrer pour une période donnée
    Par liberio dans le forum SAP Crystal Reports
    Réponses: 6
    Dernier message: 21/04/2004, 16h32

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