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 :

Restriction sur DATETIME


Sujet :

MS SQL Server

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 109
    Points : 49
    Points
    49
    Par défaut Restriction sur DATETIME
    Bonjour,

    Je voudrais savoir comment faire pour:

    Je dois faire une restriction sur une date dans une table.
    Pour ce faire je souhaite que l'utilisateur entre un mois et une année que j'utiliserais comme paramètres d'entrées dans mon script.

    Exemple SET @Mois = 01
    SET @Annee = 2010

    J'ai mis cette 2 variables en type INT.

    Je voudrais donc faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM maTable
    WHERE Date LIKE ....
    Quelques chose comme ça mais c'est là où je bloque.

    J'aimerais donc avoir vos conseils.

    Merci d'avance.

  2. #2
    Membre chevronné

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Août 2007
    Messages : 1 216
    Points : 1 758
    Points
    1 758
    Par défaut
    Bonjour,

    Vous pouvez utiliser les fonctions MONTH et YEAR:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Select
    ...
    From maTable
    where MONTH(date) = @mois and YEAR(date) = @annee
    Bonne journée

  3. #3
    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 : 43
    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,

    LIKE est destiné uniquement à la recherche de sous-chaînes dans une chaîne

    Ce que vous propose Ptit_Dje vous donnera le bon résultat, mais les performances ne seront pas au rendez-vous puisque même si votre colonne date est indexée, les statistiques produites par un tel index ne s'attachent qu'à la date et pas à son mois, son année, ...

    Si vous ne voulez donc rechercher que sur un seul mois et profiter de l'indexation, il vous faut écrire :

    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
    CREATE PROCEDURE psGetDataBetweenDates
    	@mois TINYINT,
    	@annee SMALLINT
    AS
    BEGIN
    	SET NOCOUNT ON
     
    	------------------------------
    	-- Vérification des paramètres
    	------------------------------
    	IF @mois IS NULL OR @annee IS NULL
    	BEGIN
    		RAISERROR('Les paramètres doivent être correctement valués', 16, 1)
    		RETURN
    	END
     
    	IF @mois NOT BETWEEN 1 AND 12
    	BEGIN
    		RAISERROR('Mois incorrect !', 16, 1)
    		RETURN	
    	END
     
    	IF @annee NOT BETWEEN 0 AND YEAR(GETDATE())
    	BEGIN
    		RAISERROR('Année incorrecte !', 16, 1)
    		RETURN
    	END
    	-------------
    	-- Traitement
    	-------------
    	DECLARE @dateDebut DATETIME,
    		@dateFin DATETIME,
    		@moisChaine CHAR(2)
     
    	SELECT @moisChaine = CASE LEN(@mois)
    					WHEN 1 THEN '0' + CAST(@mois AS CHAR(1))
    					ELSE CAST(@mois AS CHAR(2))
    				END
     
    	SELECT @dateDebut = CAST(CAST(@annee AS CHAR(4)) + @moisChaine + '01' AS DATETIME) -- premier jour du mois	
    	SELECT @dateFin = DATEADD(day, -1, DATEADD(month, 1, @dateDebut)) -- dernier jour du mois
     
    	SELECT mesColonnes
    	FROM dbo.maTable
    	WHERE maColonneDate BETWEEN @dateDebut AND @dateFin
    Pour exécuter :

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

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 109
    Points : 49
    Points
    49
    Par défaut
    Merci c'est exactement ce qu'il me fallait et même plus car il y a une vérification des données saisies par l'utilisateur.

  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 : 43
    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
    J'ai écrit une erreur à la ligne suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT @dateFin = DATEADD(day, -1, DATEADD(month, 1, @dateDebut)) -- dernier jour du mois
    Or vous cherchez sur le mois entier, et cette ligne vous retourne le dernier jour du mois mais à minuit, donc il vous manquera un jour.

    Il faut donc corriger en écrivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT @dateFin = DATEADD(month, 1, @dateDebut)
    @++

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 109
    Points : 49
    Points
    49
    Par défaut
    Oui j'ai remarqué mais j'avais fait la modification immédiatement.

  7. #7
    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 : 43
    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
    Vous n'êtes pas exempté de me corriger !

    @++

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

Discussions similaires

  1. est ce qu'il y a des restriction sur la taille ?
    Par arakiri dans le forum Applets
    Réponses: 2
    Dernier message: 10/01/2007, 09h55
  2. [SqlSrv 2K] Index sur DateTime
    Par yinyang dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 07/06/2006, 15h03
  3. ajouter une restriction sur une requete
    Par linou dans le forum Oracle
    Réponses: 2
    Dernier message: 19/10/2005, 14h20
  4. restriction sur le nombre d'enregistrements !
    Par anas123 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 22/07/2005, 19h57
  5. Index sur datetime ne fonctionnant pas
    Par Pierrinot dans le forum Requêtes
    Réponses: 5
    Dernier message: 18/10/2004, 09h10

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