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

Développement SQL Server Discussion :

Trouver une date à partir de 3 champs (Année, Semaine, jour)


Sujet :

Développement SQL Server

  1. #1
    Candidat au Club
    Inscrit en
    Juin 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 6
    Points : 2
    Points
    2
    Par défaut Trouver une date à partir de 3 champs (Année, Semaine, jour)
    Bonjour à tous,

    J'ai une base de données avec la date éclatée sur trois champs :
    - l'année
    - le numéro de semaine
    - le numéro du jour

    Mon problème est que le jour n'est pas continu. Il repart à "1" à chaque nouvelle semaine.

    Par exemple
    ColA ! B ! C
    2010 ! 2 ! 1
    2010 ! 2 ! 2
    2010 ! 2 ! 3
    2010 ! 2 ! 4
    2010 ! 2 ! 5
    2010 ! 2 ! 6
    2010 ! 3 ! 1
    2010 ! 3 ! 2

    Je débute en Sql (en requête de sélection uniquement ).
    J'ai trouvé la fonction DatePart mais je ne pense pas que ce soit celle appropriée.

    Merci par avance pour votre aide,
    Sofhy

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    quel est ton SGBD ?
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  3. #3
    Candidat au Club
    Inscrit en
    Juin 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Antoun Voir le message
    quel est ton SGBD ?
    C'est une base sous Microsoft Server Sql 2000

  4. #4
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut !

    http://technet.microsoft.com/fr-fr/l.../ms174420.aspx

    Format "weekday" ou "wd", c'est pas ça ?

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

  5. #5
    Candidat au Club
    Inscrit en
    Juin 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Bonjour Pacman, et le forum,

    J'ai fait des tests, mais le résultat renvoyé est un chiffre unique. Cela dit, compte tenu de mon niveau, je ne sais peut être pas utiliser la fonction.

    Je vous joins un fichier Excel avec mes trois colonnes. Sous Excel, je retrouve la date mais sous Sql ???? comment faire ...

    Merci,
    Fichiers attachés Fichiers attachés

  6. #6
    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,

    Si j'ai bien compris, vous devriez utiliser DATEPART(dayofyear, date), mais dans votre cas je ne suis pas sûr que vous arrivez à vos fins.

    Je montre ici comment créer une table de dates, mais la procédure stockée de population de la table ne fonctionne pas sous SQL Server 2000.

    Vous pouvez la remplacer par la suivante :

    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
    ALTER PROCEDURE Ps_GenereDatesAnnee 
    	@annee SMALLINT 
    AS 
    BEGIN 
    	SET NOCOUNT ON 
     
    	DECLARE @dateDeb DATETIME, 
    		@dateFin DATETIME 
     
    	SELECT @dateDeb = CAST(CAST(@annee AS VARCHAR) + '0101' AS DATETIME), 
    		@dateFin = CAST(CAST(@annee AS VARCHAR) + '1231' AS DATETIME) 
     
    	WHILE NOT EXISTS
    	(
    		SELECT	*
    		FROM	dbo.TbDates
    		WHERE	date = @dateFin
    	)
    	BEGIN
    		INSERT INTO dbo.maTableDeDates(date)
    		SELECT @dateDeb
     
    		SET @dateDeb = DATEADD(day, 1, @dateDeb)
    	END
    END
    Dans votre cas la table serait plutôt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TABLE TbDates 
    ( 
      date DATETIME NOT NULL CONSTRAINT PK_TbDates_date PRIMARY KEY, 
      annee AS (YEAR(date)) PERSISTED NOT NULL, 
      mois AS(MONTH(date)) PERSISTED NOT NULL, 
      jourDansAnnee AS (DATEPART(dayofyear, date)) PERSISTED NOT NULL
    ) 
    GO
    Et vous n'avez pas besoin du trigger.

    Si vous voulez conserver votre table telle qu'elle est, changez la procédure comme suit :

    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
    CREATE PROCEDURE Ps_GenereDatesAnnee
    	@annee smallint
    AS
    BEGIN
    	SET NOCOUNT ON
     
    	DECLARE @dateDeb datetime
    		, @datefin datetime
     
    	SELECT @dateDeb = CAST(CAST(@annee AS VARCHAR) + '0101' AS DATETIME), 
    		@dateFin = CAST(CAST(@annee AS VARCHAR) + '1231' AS DATETIME)	
     
    	WHILE @dateDeb <= @dateFin
    	BEGIN
    		INSERT INTO dbo.TbDates
    		(
    			annee
    			, semaine
    			, jour
    		)
    		SELECT	YEAR(@dateDeb)
    			, DATEPART(week, @dateDeb)
    			, DATEPART(dayofyear, @dateDeb)
     
    		SET @dateDeb = DATEADD(day, 1, @dateDeb)
    	END
    END
    Pour 2010, il suffit d'exécuter :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EXEC dbo.Ps_GenereDatesAnnee 2010
    @++

  7. #7
    Candidat au Club
    Inscrit en
    Juin 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Bonjour Elsuket,

    Et bien, je vois que ma marge de progression est énorme

    Par contre, je ne peux pas créer de table temporaire. La base est un Erp et je me trouve du côté client. J'exploite les données via Msquery pour combler le manque de tableaux de bord de l'outil.

    Y aurait-il une possibilité dans le "Select" d'avoir un champ calculé avec cette date sans pour autant créer une table temp ?

    Merci ,
    Sofhy

  8. #8
    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
    Y aurait-il une possibilité dans le "Select" d'avoir un champ calculé avec cette date sans pour autant créer une table temp ?
    Aucun des scripts que je vous ai donné ne crée de table temporaire, donc je ne suis pas sûr de bien comprendre.
    Est-ce que la table que vous avez donné dans votre premier post a été créée par vous ?
    Sinon, donnez votre requête

    @++

  9. #9
    Candidat au Club
    Inscrit en
    Juin 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Bjr Elsuket,

    Autant pour moi, j'ai mal analysé le script.
    Je teste aujourd'hui sur la base de démo et je vous tiens au courant.

    Bonne journée,

  10. #10
    Candidat au Club
    Inscrit en
    Juin 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Bonjour elsuket, pacmann, Antoun

    Il me semblait bien que j'avais oublié de le faire...
    MERCI.
    Désolée pour le retard. Mieux vaut tard que jamais.

    Sofhy

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

Discussions similaires

  1. [2008R2] Récupérer une date à partir d'un numéro de semaine et d'une année.
    Par ff.martin dans le forum Développement
    Réponses: 5
    Dernier message: 24/07/2014, 15h20
  2. Trouver une date à partir d'un quantième
    Par hycar33 dans le forum SQL
    Réponses: 2
    Dernier message: 19/01/2012, 11h19
  3. Trouver une date d'après un N° de semaine et une année
    Par lezinve dans le forum Général VBA
    Réponses: 2
    Dernier message: 26/02/2010, 12h38
  4. [VB.Net] Obtenir une date à partir d'un numero de semaine
    Par tonysky dans le forum Windows Forms
    Réponses: 4
    Dernier message: 03/01/2007, 08h57
  5. trouver une date à partir d'un nombre de jours
    Par charlene44 dans le forum Delphi
    Réponses: 4
    Dernier message: 21/08/2006, 14h27

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