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 :

Filtre entre le dernier Lundi du mois précédent et


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juin 2005
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 56
    Par défaut Filtre entre le dernier Lundi du mois précédent et
    Bonjour
    je voudrais filtrer des enregistrements entre le dernier Lundi du mois précédent et le dernier dimanche du mois en cours.

    Je sèche complet sur mon dateadd.

    Merci de votre aide

  2. #2
    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 : 44
    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
    Par défaut
    Bonjour,

    Créez pour cela une table de dates pour l'année, comme j'ai pu le montrer ici, et vous verrez que vos requêtes n'en seront que plus simples.

    Je vais vous donner une version simplifiée de ce billet.
    Créons tout d'abord la table de dates :

    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
    51
    52
    -- Définit Lundi comme étant le 1er jour de la semaine
    SET DATEFIRST 1
    GO
     
    CREATE TABLE TbDates
    (
    	date DATETIME NOT NULL CONSTRAINT PK_TbDates PRIMARY KEY,
    	mois AS (MONTH(date)) PERSISTED NOT NULL,
    	numeroJourSemaine TINYINT
    )
    GO
     
    CREATE TRIGGER TR_A_I_TbDates
    	ON dbo.TbDates
    	AFTER INSERT
    AS
    BEGIN
    	SET NOCOUNT ON
     
    	UPDATE dbo.TbDates
    	SET numeroJourSemaine = DATEPART(weekday, D.date)
    	FROM dbo.TbDates AS D 
    	JOIN INSERTED AS I 
    		ON D.date = I.date 
    END
    GO
     
    DECLARE @dateDeb DATETIME SET @dateDeb = '20090101'
     
    -- Remplissage de la table
    WHILE NOT EXISTS
    (
    	SELECT *
    	FROM dbo.TbDates
    	WHERE date = '20091231'
    )
    BEGIN
    	INSERT INTO dbo.TbDates (date)
    	VALUES (@dateDeb)
     
    	SET @dateDeb = @dateDeb + 1
    END
    GO
     
    ALTER TABLE dbo.TbDates
    ALTER COLUMN numeroJourSemaine TINYINT NOT NULL
    GO
     
    CREATE INDEX IX_TbDates_numeroJourSemaine_mois
    ON dbo.TbDates(numeroJourSemaine, mois)
    WITH (FILLFACTOR = 100)
    GO
    Et voici la procédure stockée :

    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
    CREATE PROCEDURE PsGetData
    AS
    BEGIN
    	DECLARE @dernierLundiMoisDernier DATETIME,
    			@dernierDimancheMoisCourant DATETIME
     
    	-- Recherche du dernier lundi du mois dernier
    	SELECT @dernierLundiMoisDernier = MAX(date)
    	FROM dbo.TbDates
    	WHERE mois = MONTH(GETDATE()) - 1
    	AND numeroJourSemaine = 1 -- Lundi
     
    	-- Recherche du dernier dimanche du mois courant
    	SELECT @dernierDimancheMoisCourant = MAX(date)
    	FROM dbo.TbDates
    	WHERE mois = MONTH(GETDATE())
    	AND numeroJourSemaine = 7 -- Dimanche
     
    	-- Retourne les données
    	SELECT mesColonnes
    	FROM dbo.maTable
    	WHERE maColonneDate BETWEEN @dernierLundiMoisDernier AND @dernierDimancheMoisCourant
    END
    @++

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2005
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 56
    Par défaut
    Merci beaucoup pour l'idée

    Je vais voir ça en essayant directement avec datepart car ça me renvoie le numero du jour de la semaine.

    Merci encore

  4. #4
    Membre confirmé
    Inscrit en
    Juin 2005
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 56
    Par défaut
    Merci Elsuket pour la réponse car j'ai arrangé à ma sauce et ça fonctionne.

    Mon souci maintenant est que j'ai mis le mois variable de la PS et çc fonctionne impec.
    Par contre, au lieu du mois en variable ou en cour je voudrais afficher le détail complet mois par mois .

    C'est à dire

    Select @MonMois, *
    from MaTable
    where Madate between @DernierLundi and DernierDimanche

    Mais ayant tous les mois. Et là je vois pas comment boucler pour que ça affiche tout les mois sans faire 12 union.
    C'est peut etre la seule solution !


    Merci encore de votre aide

  5. #5
    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 : 44
    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
    Par défaut
    Essayez :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT MONTH(maDate), mesAutresColonnes
    FROM dbo.MaTable
    WHERE Madate BETWEEN @DernierLundi AND @DernierDimanche
    N'écrivez jamais * dans une requête qui va tourner en production, sauf dans un prédicat EXISTS ou pour la fonction d'agrégation COUNT(), qui sont spécialement optimisés pour cela.
    En effet, en faisant cela, vous empêchez l'optimisation du plan de requête, puisque le moteur de base de données devra interroger les tables de métadonnées pour connaître la liste des colonnes à retourner.
    De plus, il n'est pas forcément nécessaire de retourner tous les colonnes, donc vous minimiserez les échanges réseau

    @++

  6. #6
    Membre confirmé
    Inscrit en
    Juin 2005
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 56
    Par défaut
    Merci pour le conseil sur *

    A+

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 06/08/2013, 16h59
  2. Afficher dernier jour du mois précédent
    Par kedmard dans le forum VBA Access
    Réponses: 8
    Dernier message: 23/03/2012, 18h03
  3. Requete jusqu'au dernier jour du mois précédent
    Par stephanies_1977 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 06/01/2009, 11h01
  4. [MDX] filtre sur les mois précédents
    Par phoenix75 dans le forum SSAS
    Réponses: 0
    Dernier message: 16/09/2008, 15h00
  5. [Dates] 1er Lundi et le dernier Lundi d'un mois
    Par mic79 dans le forum Langage
    Réponses: 2
    Dernier message: 30/09/2005, 17h19

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