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 :

Récupérer le mois qui précède [2008]


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Homme Profil pro
    Je produit des statistiques pour le SDIS 47.
    Inscrit en
    Avril 2014
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Je produit des statistiques pour le SDIS 47.
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2014
    Messages : 73
    Points : 53
    Points
    53
    Par défaut Récupérer le mois qui précède
    Je fais des requêtes sur le mois qui précède, ce qui jusque là est simple puisque la formule :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DATEPART(MONTH,PC.DH_DEBUT) = DATEPART(MONTH,GETDATE()) - 1
    fonctionne très bien.

    Par contre, lorsque je change d'année, celle-ci me renvoie un fichier vide. Comment puis-je faire pour récupérer le mois de l'année - 1.

    Cordialement.

    Taz

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Connais-tu la fonction DATEADD(datepart, number, date) ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre du Club
    Homme Profil pro
    Je produit des statistiques pour le SDIS 47.
    Inscrit en
    Avril 2014
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Je produit des statistiques pour le SDIS 47.
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2014
    Messages : 73
    Points : 53
    Points
    53
    Par défaut Récupérer le mois qui précède
    Pas du tout.

    La solution que j'avais trouvé était la formule suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CASE  WHEN YEAR(STA.[DH_DEBUT_INTER]) = YEAR(GETDATE())-1 AND MONTH(STA.[DH_DEBUT_INTER]) = 12 THEN 1
              WHEN YEAR(STA.[DH_DEBUT_INTER]) = YEAR(GETDATE())   AND MONTH(STA.[DH_DEBUT_INTER]) = MONTH(GETDATE()) - 1  THEN 1 ELSE 0 END = 1
    Le problème est que le mois de Décembre remonte systématiquement.

    Merci.

    Taz

  4. #4
    Membre éclairé
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Décembre 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Décembre 2007
    Messages : 327
    Points : 674
    Points
    674
    Par défaut
    Bonjour,

    Essayez donc la formule avec DATEADD :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    SELECT DATEADD(MONTH,-1,CAST('01/01/2016'as date))
    MCSA SQL SERVER |MCT | MVP Data Platform

  5. #5
    Membre du Club
    Homme Profil pro
    Je produit des statistiques pour le SDIS 47.
    Inscrit en
    Avril 2014
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Je produit des statistiques pour le SDIS 47.
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2014
    Messages : 73
    Points : 53
    Points
    53
    Par défaut
    Est ce que cela veut dire que tous les ans je serai obligé de changer ma date?

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Si votre besoin fonctionnel est d'obtenir le mois qui précède le mois en cours, alors la solution avec DATEADD proposée plus haut fonctionnera, il suffit de lui communiquer la date du jour en variable

  7. #7
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    La solution que vous essayez de mettre en place ne permettra en plus pas l'utilisation d'index. évitez tant que possible de faire des calculs impliquant des colonnes dans vos filtres.

    Les données du "mois précédent" sont celles dont la date se situe entre le premier et le dernier jour du mois précédent.

    pour calculer ces deux dates, voici un peu d'aide

  8. #8
    Membre du Club
    Homme Profil pro
    Je produit des statistiques pour le SDIS 47.
    Inscrit en
    Avril 2014
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Je produit des statistiques pour le SDIS 47.
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2014
    Messages : 73
    Points : 53
    Points
    53
    Par défaut
    J'ai trouvé la solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DATEPART(MONTH,AE.DH_DEBUT_INTER) = MONTH(DATEADD(MONTH,-1, GETDATE()))
    AND  DATEPART(YEAR,AE.DH_DEBUT_INTER) = YEAR(DATEADD(MONTH,-1, GETDATE()))
    En vous remerciant pour vos réponses.

    Taz.


  9. #9
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Comme je le disais, une telle solution empêchera l'utilisation des index.

    Il serait bien préférable de procéder ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    AE.DH_DEBUT_INTER >= DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) - 1, 0) 
     AND AE.DH_DEBUT_INTER < DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0)

  10. #10
    Membre du Club
    Homme Profil pro
    Je produit des statistiques pour le SDIS 47.
    Inscrit en
    Avril 2014
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Je produit des statistiques pour le SDIS 47.
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2014
    Messages : 73
    Points : 53
    Points
    53
    Par défaut
    J'ai du mal à comprendre cette formule mais en suivant vos conseils, elle fonctionne très bien.
    Néanmoins, je me suis aperçu que si mes requêtes sont générées dans les quelques jours qui suivent la fin du mois (le 10 du mois pour le mois qui précède), certaines lignes ne sont pas prises en compte car non remplies par les agents.
    Aussi, je vais devoir faire mes requêtes avec 2 mois de décalage. Donc, j'ai modifié ma requête de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    where  I.DH_DEBUT_INTER >= DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) - 2,0) 
    AND    I.DH_DEBUT_INTER < DATEADD(MONTH, DATEDIFF(MONTH,0, GETDATE()), 0)
    En faisant ma requête en Octobre, cela me remonte bien le mois d'Août, mais j'ai aussi des lignes de Septembre.



    Pouvez-vous m'aider?

    Cordialement.

    Taz

  11. #11
    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 on exécute :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT	DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) - 2, 0) 
    	, DATEADD(MONTH, DATEDIFF(MONTH,0, GETDATE()), 0)
    Nous obtenons : 2016-08-01 00:00:00.000 2016-10-01 00:00:00.000

    Pour obtenir l'intervalle de dates recherché, il suffit donc de modifier à :

    CODE]SELECT DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) - 2, 0)
    , DATEADD(MONTH, DATEDIFF(MONTH,0, GETDATE()) - 1, 0)[/CODE]

    Et nous obtenons alors : 2016-08-01 00:00:00.000 2016-09-01 00:00:00.000

    La clause WHERE devient donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    where I.DH_DEBUT_INTER >= DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) - 2,0) 
    AND I.DH_DEBUT_INTER < DATEADD(MONTH, DATEDIFF(MONTH,0, GETDATE()) - 1, 0)
    En ce qui concerne la formule de calcul, elle se sert du fait que le zéro dans SQL Server est compris comme le premier janvier 1900 à minuit.
    Donc DATEDIFF(MONTH,0, GETDATE()) calcule la différence en nombre de mois entre 01/01/1900 et aujourd'hui.
    On soustrait ensuite un mois à cette différence, et on ajoute, en nombre de mois, le résultat à 01/01/1900 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DATEADD(MONTH, DATEDIFF(MONTH,0, GETDATE()) - 1, 0)
    Ce qui nous donne donc le premier jour du mois précédent.
    Si l'on met -2, on obtient le premier jour du mois précédant le mois précédent.

    @++

  12. #12
    Membre du Club
    Homme Profil pro
    Je produit des statistiques pour le SDIS 47.
    Inscrit en
    Avril 2014
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Je produit des statistiques pour le SDIS 47.
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2014
    Messages : 73
    Points : 53
    Points
    53
    Par défaut
    Je vous remercie pour votre réponse rapide qui va me faciliter mon travail.

    Puis-je dire que mon problème est résolu?

    Cordialement

    Taz.


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

Discussions similaires

  1. Réponses: 4
    Dernier message: 03/12/2014, 11h07
  2. [Thread]Récupérer un Thread qui tourne
    Par thibaut dans le forum Concurrence et multi-thread
    Réponses: 3
    Dernier message: 09/02/2006, 11h43
  3. Récupérer l'objet qui a le focus
    Par Johnbob dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 20/01/2006, 14h40
  4. Récupérer le mois et l'année d'une date
    Par missllyss dans le forum SQL
    Réponses: 2
    Dernier message: 23/09/2003, 09h17

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