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 :

récuprer numéro de semaine


Sujet :

MS SQL Server

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Novembre 2007
    Messages : 81
    Points : 56
    Points
    56
    Par défaut récuprer numéro de semaine
    Bonjour,

    je créé en ce moment un programme et je fais appel à une base de données sous sql serveur 2005.
    Je souhaiterai afficher le temps passé par un employé sur une tache pour les semaines du mois en cours sachant que le mois change...
    Aussi, par la suite j'aimerai intégrer une notion d'historique: on est en février, j'aimerai afficher combien de temps l'employé a travaillé par semaine en janvier.
    La difficulté se trouve en faite dans la notion de "par semaine"... J'aimerai donc afficher aussi le numéro de semaine correspondant ou le premier jour de la semaine concernée.

    Voici le script de création de ma table qui stock le temps passé par les employés:

    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 TABLE [dbo].[TEMPSPASSE](
    	[ID] [int] IDENTITY(1,1) NOT NULL,
    	[TABLEC] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    	[INTITULE] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    	[LIGNE] [int] NULL,
    	[SALARIEID] [int] NULL,
    	[DEBUT] [datetime] NULL,
    	[FIN] [datetime] NULL,
    	[DATE_CREATION] [datetime] NULL,
    	[DATE_MAJ] [datetime] NULL,
     CONSTRAINT [PK_TEMPSPASSE] PRIMARY KEY CLUSTERED 
    (
    	[ID] ASC
    )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
    ) ON [PRIMARY]
    Actuellement j'obtiens le temps par calcul comme vous pouvez le comprendre en faisant une différence entre fin et début.

    Merci par avance de votre aide.
    J'espère avoir été assez clair dans ma demande.
    Bonne journée à tous

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 865
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 865
    Points : 53 021
    Points
    53 021
    Billets dans le blog
    6
    Par défaut
    Le plus simple est d'implémenter une table de calendrier comme je l'ai indiqué dans cet article : http://sqlpro.developpez.com/cours/gestiontemps/
    Après, il suffit de faire une jointure avec cette table pour obtenir toutes les combinaisons de données nécessaire.

    A +

  3. #3
    Membre averti

    Profil pro
    En reconversion
    Inscrit en
    Novembre 2007
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : En reconversion

    Informations forums :
    Inscription : Novembre 2007
    Messages : 180
    Points : 351
    Points
    351
    Par défaut
    Bonjour,

    une solution :

    -- d'abord j'ajoute une ligne à la table crée via votre script
    INSERT INTO [TEST].[dbo].[TEMPSPASSE]
    ([TABLEC],[INTITULE],[LIGNE],[SALARIEID],[DEBUT],[FIN],[DATE_CREATION],[DATE_MAJ])
    VALUES ('t','t',5,1,'01/01/2009','05/01/2009','01/01/2009','02/01/2009')

    -- puis je crée une table calendrier (ultra simplifié ici)
    CREATE TABLE [calendrier](
    [Date] [datetime] NOT NULL,
    [Annee] [int] NOT NULL,
    [Mois] [tinyint] NOT NULL,
    [Semaine] [tinyint] NOT NULL
    ) ON [PRIMARY]

    -- que j'alimente pour le mois de janvier 2009
    INSERT INTO [calendrier] ([Date],[Annee],[Mois],[Semaine]) VALUES ('1/1/2009',2009,1,1)
    INSERT INTO [calendrier] ([Date],[Annee],[Mois],[Semaine]) VALUES ('2/1/2009',2009,1,1)
    INSERT INTO [calendrier] ([Date],[Annee],[Mois],[Semaine]) VALUES ('3/1/2009',2009,1,1)
    INSERT INTO [calendrier] ([Date],[Annee],[Mois],[Semaine]) VALUES ('4/1/2009',2009,1,1)
    INSERT INTO [calendrier] ([Date],[Annee],[Mois],[Semaine]) VALUES ('5/1/2009',2009,1,2)
    INSERT INTO [calendrier] ([Date],[Annee],[Mois],[Semaine]) VALUES ('6/1/2009',2009,1,2)
    INSERT INTO [calendrier] ([Date],[Annee],[Mois],[Semaine]) VALUES ('7/1/2009',2009,1,2)
    INSERT INTO [calendrier] ([Date],[Annee],[Mois],[Semaine]) VALUES ('8/1/2009',2009,1,2)
    INSERT INTO [calendrier] ([Date],[Annee],[Mois],[Semaine]) VALUES ('9/1/2009',2009,1,2)
    INSERT INTO [calendrier] ([Date],[Annee],[Mois],[Semaine]) VALUES ('10/1/2009',2009,1,2)
    INSERT INTO [calendrier] ([Date],[Annee],[Mois],[Semaine]) VALUES ('11/1/2009',2009,1,2)
    INSERT INTO [calendrier] ([Date],[Annee],[Mois],[Semaine]) VALUES ('12/1/2009',2009,1,3)
    INSERT INTO [calendrier] ([Date],[Annee],[Mois],[Semaine]) VALUES ('13/1/2009',2009,1,3)
    INSERT INTO [calendrier] ([Date],[Annee],[Mois],[Semaine]) VALUES ('14/1/2009',2009,1,3)
    INSERT INTO [calendrier] ([Date],[Annee],[Mois],[Semaine]) VALUES ('15/1/2009',2009,1,3)
    INSERT INTO [calendrier] ([Date],[Annee],[Mois],[Semaine]) VALUES ('16/1/2009',2009,1,3)
    INSERT INTO [calendrier] ([Date],[Annee],[Mois],[Semaine]) VALUES ('17/1/2009',2009,1,3)
    INSERT INTO [calendrier] ([Date],[Annee],[Mois],[Semaine]) VALUES ('18/1/2009',2009,1,3)
    INSERT INTO [calendrier] ([Date],[Annee],[Mois],[Semaine]) VALUES ('19/1/2009',2009,1,4)
    INSERT INTO [calendrier] ([Date],[Annee],[Mois],[Semaine]) VALUES ('20/1/2009',2009,1,4)
    INSERT INTO [calendrier] ([Date],[Annee],[Mois],[Semaine]) VALUES ('21/1/2009',2009,1,4)
    INSERT INTO [calendrier] ([Date],[Annee],[Mois],[Semaine]) VALUES ('22/1/2009',2009,1,4)
    INSERT INTO [calendrier] ([Date],[Annee],[Mois],[Semaine]) VALUES ('23/1/2009',2009,1,4)
    INSERT INTO [calendrier] ([Date],[Annee],[Mois],[Semaine]) VALUES ('24/1/2009',2009,1,4)
    INSERT INTO [calendrier] ([Date],[Annee],[Mois],[Semaine]) VALUES ('25/1/2009',2009,1,4)
    INSERT INTO [calendrier] ([Date],[Annee],[Mois],[Semaine]) VALUES ('26/1/2009',2009,1,5)
    INSERT INTO [calendrier] ([Date],[Annee],[Mois],[Semaine]) VALUES ('27/1/2009',2009,1,5)
    INSERT INTO [calendrier] ([Date],[Annee],[Mois],[Semaine]) VALUES ('28/1/2009',2009,1,5)
    INSERT INTO [calendrier] ([Date],[Annee],[Mois],[Semaine]) VALUES ('29/1/2009',2009,1,5)
    INSERT INTO [calendrier] ([Date],[Annee],[Mois],[Semaine]) VALUES ('30/1/2009',2009,1,5)
    INSERT INTO [calendrier] ([Date],[Annee],[Mois],[Semaine]) VALUES ('31/1/2009',2009,1,5)

    -- ensuite je joins la table maitre avec le calendrier pour décomposer en jour et donc en semaine
    WITH TMP AS ( SELECT [ID],[TABLEC],[INTITULE],[LIGNE],[SALARIEID],[DEBUT],[FIN],[DATE_CREATION],[DATE_MAJ],TAB2.Date,TAB2.Semaine
    FROM [TEMPSPASSE] AS TAB1
    INNER JOIN [calendrier] AS TAB2 ON TAB2.Date >= TAB1.DEBUT AND TAB2.Date <= TAB1.FIN )

    -- puis je calcule l'agrégat
    SELECT [SALARIEID] , Semaine, COUNT(Semaine) AS NbJourParSemaine
    FROM TMP
    GROUP BY [SALARIEID] , Semaine

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Novembre 2007
    Messages : 81
    Points : 56
    Points
    56
    Par défaut
    Bonjour a tous,
    j'ai reussi a obtenir ce que je voulais avec un bout de code finalement assez simple et qui pourra éventuellement resservir à d'autres:

    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
    DROP FUNCTION SEMAINE_MOIS
    GO
    CREATE FUNCTION [dbo].[SEMAINE_MOIS] (@mois INT)
    RETURNS @semaines TABLE 
    (NOM_MOIS VARCHAR(20), ANNEE VARCHAR(20), NUM_SEMAINE INT)
    AS
    BEGIN
    WITH
      CTE AS
      (
        SELECT
          DATEADD(month, @mois,DATEADD(day, -DATEPART(day, getdate() ) +1, getdate())) Jour
    		UNION ALL
    		SELECT
    		  DATEADD(day, 1, Jour)
    		FROM
    		  CTE
    		WHERE
    		  Jour < DATEADD(month, @mois,DATEADD(month,+1,DATEADD(day, -DATEPART(day, getdate()) , getdate())))
    	)
    INSERT @semaines 
    SELECT DISTINCT
    	DATENAME(month, Jour) AS MOIS,
    	DATEPART(year, Jour) AS ANNEE,
      DATEPART(week, Jour) AS SEMAINE
    FROM CTE
    RETURN
    END
     
     
     
    SELECT
    	NUM_SEMAINE,
    	NOM_MOIS,
    	ANNEE
    FROM
    	SEMAINE_MOIS(0);
    Après, au sein de mon programme le parametre de semaine_mois est remplacé par une variable. Ceci est donc perpetuel.
    Cependant attention car ce calendrier retourne 53 semaines (pas top) mais conviens parfaitement à l'utilisation que j'en aurais.

    Merci a tous pour vos reponses.
    Bonne soirée

    18Carats

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

Discussions similaires

  1. [C#] Comment récupérer le numéro de semaine d'une date ?
    Par farfadet dans le forum Windows Forms
    Réponses: 9
    Dernier message: 17/07/2013, 16h33
  2. Récupérer numéro de semaine
    Par nawal59 dans le forum SQL
    Réponses: 6
    Dernier message: 20/07/2010, 11h41
  3. Récupérer numéro de semaine d'un parametre "Date"
    Par rose_des_sables dans le forum Formules
    Réponses: 1
    Dernier message: 13/11/2008, 13h42
  4. Récupérer numéro de semaine courrante avec MySQL
    Par bobic dans le forum Requêtes
    Réponses: 2
    Dernier message: 11/07/2006, 20h11
  5. [Access 2000] Récupérer le numéro de semaine
    Par Korskarn dans le forum Access
    Réponses: 10
    Dernier message: 11/07/2006, 13h54

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