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
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
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 :
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
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
@++
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![]()
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
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
Essayez :
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.
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
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
@++![]()
Merci pour le conseil sur *
A+
Partager