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

Langage SQL Discussion :

[REQUETE SQL -SELECT] Compter le nombre de jours.


Sujet :

Langage SQL

  1. #1
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    467
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 467
    Points : 144
    Points
    144
    Par défaut [REQUETE SQL -SELECT] Compter le nombre de jours.
    Bonjour,

    Je suis en train de développer une application pour gérer les arrêts maladie de mon entreprise.

    Mais afin de vérifier quelques détails avant de valider l'arrêt. Il me faut compter le nombre de jour dont la personne a été arrêté sur l'année N-1.

    Comment faire pour compter le nombre de jour sur une requête de type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT *
    FROM arret
    Where arret.matricule = @matricule
    and arret.date_debut BETWEEN @date_debut_n1 AND @date_debut;
    Pouvez-vous m'aider?
    Merci,
    .Matthieu

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 802
    Points
    30 802
    Par défaut
    Il nous manque peut-être un peu d'informations pour commencer à réfléchir à une réponse...
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Merci de spécifier la structure des tables.

    Si vos arrêts sont enregistrés sous la forme de période (debut-fin), vous pouvez effectuer la somme de la difference entre fin et début.

    Si vous arrêts son enregistrés sous forme d'une liste de jours, vous pouvez faire un compte.

  4. #4
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    467
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 467
    Points : 144
    Points
    144
    Par défaut
    EDITER ::

    En fait je peux le faire avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DATEDIFF(date_deb,date_fin)
    Mais comment faire pour compter dans une seule requête le nombre de jour d'arrêt total sur l'année N-1?

    J'ai un salarié (MATRICULE),
    Une année N-1,
    Des arrêts sur N-1,
    Et je voudrais la somme totale en jours des arrêts de N-1.

    STRUCTURE DES TABLES :

    Salarié :
    MATRICULE int,
    nom varchar(50),
    prenom varchar(50)


    Arret :
    numeros_arret int,
    date_debut DATETIME,
    date_fin DATETIME
    matricule_salarie int <=== Clé étrangère




    Comment faire?
    Merci,
    .Matthieu

  5. #5
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Vous n'avez peut être jamais utilisé de fonction d'agrégat (sum, count, min, ...). Dans votre cas, et comme vous l'avez dit, il s'agit de faire une somme.

    Voir ce cours pour maitriser la chose : http://sqlpro.developpez.com/cours/sqlaz/ensembles/#L0

  6. #6
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    467
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 467
    Points : 144
    Points
    144
    Par défaut
    J'essaye de faire une procédure stocké pour récupérer le nombre de jour de maintien de salaire auxquel le salarié à le droit en fonction du nombre de jour arrété sur l'année N-1 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    CREATE PROCEDURE salarie_ma_disponible @matricule int,@date_debut datetime, @date_debut_n1 datetime AS
    BEGIN
    --Dclaration de la variable d'accueil du Nbre de jour MA auxquel le salari  le droit
    DECLARE 
    	@nbre_ma int,
    	@temp int
     
    	--Vrification si le MATRICULE existe dans la BDD
    	IF EXISTS (SELECT * from personnel where matricule = @matricule)
    	BEGIN
     
    		--Vrification si le salari a eu un arret sur l'anne N-1
    		IF EXISTS (SELECT * from arret where matricule = @matricule and date_debut BETWEEN @date_debut_n1 and @date_debut)
    		BEGIN
    			--Rcupration du nombre de jour d'arrt sur N-1
    			SELECT @temp = SUM(DATEDIFF(day,date_debut,date_fin)) 
    			from arret
    			where matricule = @matricule
    			AND date_debut BETWEEN @date_debut_n1 AND @date_debut
     
    			--Calcul du Nbre de jour de M.A. auxquel le salari  le droit
    			--SI arrt sur N-1 alors calcul 90 - TEMP = Nombre M.A.
    			IF (@temp > 0)
    			BEGIN
    				@nbre_ma = 90 - @temp --<== ERREUR LIGNE 25
    			END
    			--LE salari n'a pas le droit au M.A.
    			ELSE
    			BEGIN
    				@nbre_ma = 0 --<== ERREUR LIGNE 30
    			END
    		END
    		--Le salari n'a pas eu d'arret sur l'anne N-1
    		ELSE
    		BEGIN
    			--Il a donc droit  180 jours de M.A.
    			@nbre_ma=180
    		END
    	END
    	--Le matricule n'existe pas dans la BDD
    	ELSE
    	BEGIN
    		--Valeur de retour 0 <==SALARi INEXISTANT DANS BDD
    		return 0
    	END
     
    --Valeur de retour Nbre de M.A. auxquel le salari  le droit
    return @nbre_ma
    END --<== ERREUR LIGNE 49

    Mais j'ai des erreurs lors de l'exécution du CREATE ::

    MESSAGE ERREUR (J'ai commenter les lignes avec <== ERREUR LIGNE "N") ::

    Msg102, Niveau15, tat1, Procduresalarie_ma_disponible, Ligne25
    Syntaxe incorrecte vers '@nbre_ma'.
    Msg102, Niveau15, tat1, Procduresalarie_ma_disponible, Ligne30
    Syntaxe incorrecte vers '@nbre_ma'.
    Msg102, Niveau15, tat1, Procduresalarie_ma_disponible, Ligne49
    Syntaxe incorrecte vers 'END'
    Je ne trouve pas ou il y a un problème dans ma procédure.

    .Matthieu

  7. #7
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Sans regarder en détail votre procédure, je pense qu'elle est inutile et que vous pouvez ramener les résultats souhaités en une requête.

  8. #8
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    467
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 467
    Points : 144
    Points
    144
    Par défaut
    Une REQUETE????
    Pas sur
    Je veux par le biais de cette procédure retourner le nombre de jour de Maintien de salaire auxquels un salarié à le droit.

    Et il y a différentes possibilités qui ne peuvent à mon gout être traitée en une seule requête.

    Déjà il me faut une requête pour récupérer Le nombre de jour d'arrêt sur N-1.
    Vérifier si il y a eu des arrêts
    Vérifier si le matricule existe dans la BDD
    etc...


    EDITER ::
    J'ai résolu mon problème d'allocation de valeur dans une variable il faut faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SET @nbre_ma = 90 - @temp 
    etc...

  9. #9
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT 	SALARIE.Matricule, 
    	SUM(DATEDIFF(day,date_debut,date_fin)), 
    	CASE 
    		WHEN SUM(DATEDIFF(day,date_debut,date_fin)) = 0 OR SUM(DATEDIFF(day,date_debut,date_fin))  IS NULL THEN 180
    		WHEN SUM(DATEDIFF(day,date_debut,date_fin)) > 0 THEN 90 - SUM(DATEDIFF(day,date_debut,date_fin))
    	END AS NB_MA
    FROM SALARIE 
    	LEFT JOIN ARRET
    		ON SALARIE.Matricule = ARRET.Matricule
    GROUP BY SALARIE.Matricule
    Quelque chose comme ça devrait donner toutes les infos ou pas loin. Elle sort tous les salariés ayant eu des arrêts ou non (jointure externe). Elle fait la somme des périodes d'arrêt en jours pour chacun et teste ce nombre de jours pour donner le nombre MA (je ne sais pas ce que c'est, j'ai repris le calcul de votre procédure).

    Je ne suis plus sûr du résultat d'un SUM quand il y a absence de valeur (0 ou null) c'est pourquoi j'ai testé = 0 ou IS NULL dans le premier cas.

    De toute façon requête non testée et à fignoler.

    Mais totalement faisable en une requête simple à priori.

  10. #10
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    467
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 467
    Points : 144
    Points
    144
    Par défaut
    HUmmmm

    Je suis sur le ...
    Je suis pas un PRO SQL donc je fais comme je connais .

    Mais là je suis scotché


    Le truc c'est que je veux l'intégrer dans une procédure stocké genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    CREATE PROCEDURE TEST ( @matricule int,@date_debut datetime, @date_debut_n1 datetime ) as
    BEGIN
     
    SELECT 	SALARIE.Matricule, 
    	SUM(DATEDIFF(day,date_debut,date_fin)), 
    	CASE 
    		WHEN SUM(DATEDIFF(day,date_debut,date_fin)) = 0 OR SUM(DATEDIFF(day,date_debut,date_fin))  IS NULL THEN 180
    		WHEN SUM(DATEDIFF(day,date_debut,date_fin)) > 0 THEN 90 - SUM(DATEDIFF(day,date_debut,date_fin))
    	END AS NB_MA
    FROM SALARIE 
    	LEFT JOIN ARRET
    		ON SALARIE.Matricule = ARRET.Matricule
    GROUP BY SALARIE.Matricule
     
    END

    ça fonctionnerait??
    Mais comment retourner ma valeur NB_MA en paramètre OUTPUT?

    Merci,
    .Matthieu

  11. #11
    Membre confirmé Avatar de miloux32
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    545
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 545
    Points : 565
    Points
    565
    Par défaut
    1/ il te manque la condition @matricule dans ton code.
    2/ si tu veux renvoyer uniquement un nombre, fais une fonction et pas une proc
    C'est pas parce que ca marche que c'est bon!!
    Pensez au bouton "Résolu"
    Je ne réponds pas en privé aux questions

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [SQL Server 2000] compter le nombre de jours
    Par soltani1 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 11/07/2006, 14h59
  2. [MS-DOS] Compter les nombres de jours entre deux dates diffé
    Par Furius dans le forum Scripts/Batch
    Réponses: 4
    Dernier message: 19/02/2006, 13h33
  3. [POSTGRESQL] Requete SQL SELECT
    Par angusyoung34 dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 18/02/2006, 09h30
  4. requete sql sur un grand nombre d enregistrement
    Par marielaure dans le forum Langage SQL
    Réponses: 5
    Dernier message: 13/08/2004, 11h53
  5. [SQL][ACCESS]Compter le nombres d'enregistrement dans deux..
    Par pc152 dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 05/06/2004, 12h30

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