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 :

Tri sur le MOIS en FRANCAIS après Conversion de Date au Format CHAR(14) en Format DATETIME


Sujet :

MS SQL Server

  1. #1
    Membre du Club
    Homme Profil pro
    Médecin Département d'Information Médicale (DIM)
    Inscrit en
    Janvier 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Médecin Département d'Information Médicale (DIM)
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2009
    Messages : 115
    Points : 60
    Points
    60
    Par défaut Tri sur le MOIS en FRANCAIS après Conversion de Date au Format CHAR(14) en Format DATETIME
    Bonjour

    Au sein de requêtes diverses en triant par MOIS (peu importe le reste de la requête):

    J'ai dans ma base les dates stockées sous le format: (xxxxxx étant les millièmes, centièmes de secondes, etc...)

    'YYYYMMDDxxxxxx' => Ex: '20110101000000'

    Une fonction Appelée dbo.F_VARCHAR_TO_DATETIME permet de convertir au format date

    Si je veux afficher en Majuscule le MOIS je fais:

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DISTINCT UPPER(DATENAME(MONTH,dbo.F_VARCHAR_TO_DATETIME(MATABLE.MADATE))) FROM MATABLE

    Mais si je veux trier par mois et fais:

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT DISTINCT UPPER(DATENAME(MONTH,dbo.F_VARCHAR_TO_DATETIME(MATABLE.MADATE))) FROM MATABLE
    	ORDER BY UPPER(DATENAME(MONTH,dbo.F_VARCHAR_TO_DATETIME(MATABLE.MADATE)))
    CELA NE ME TRIE PAS en JANVIER, FEV,MARS etc... mais dans l'ordre AOUT,AVRIL,DECEMBRE etc, c'est à dire par ordre ALPHABETIQUE


    J'imagine qu'il faut faire le tri de la façon suivante:

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	SELECT DISTINCT UPPER(DATENAME(MONTH,dbo.F_VARCHAR_TO_DATETIME(MATABLE.MADATE)))FROM MATABLE
    	ORDER BY SUBSTRING(MATABLE.MADATE,5,2)

    Mais j'obtiens le message:

    Les éléments ORDER BY doivent se retrouver dans la liste de sélection si SELECT DISTINCT est spécifié.

    Si je rajoute au SELECT :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT DISTINCT UPPER(DATENAME(MONTH,dbo.F_VARCHAR_TO_DATETIME(MATABLE.MADATE))),SUBSTRING(MATABLE.MADATE,5,2) FROM MATABLE
    	ORDER BY SUBSTRING(MATABLE.MADATE,5,2)
    cela me multiplie les lignes...

    JANVIER NULL
    JANVIER
    JANVIER 01
    FÉVRIER 02
    JANVIER 02
    MARS 03
    AVRIL 04
    MAI 05
    JUIN 06
    JANVIER 06
    JUILLET 07
    JANVIER 08
    AOÛT 08
    SEPTEMBRE 09
    JANVIER 09
    OCTOBRE 10
    NOVEMBRE 11
    JANVIER 11
    JANVIER 12
    DÉCEMBRE 12
    JANVIER 50


    Que faudrait-il faire?

    merci

  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 : 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,

    Le moins qu'on puisse dire, c'est que vous aimez vous compliquer la vie.
    Le mieux eut été de stocker les dates au type DATETIME ... ça aide !

    Sans cela ça vous donne des requêtes spaghetti ou alambiquées, comme vous voudrez.
    Faites la transformation au moment de l'insertion !

    Ensuite avec une petite table où vous stockez la liste des mois de l'année et leur indice, une jointure des plus simples fait le reste, et en performances s'il vous plaît

    Vous noterez que vous pouvez créer une colonne calculée qui extrait automatiquement l'indice du mois de la date insérée, puis l'indexer.

    @++

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 394
    Points
    18 394
    Par défaut
    Comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT upper(DATENAME(Month, MaDate))
      FROM 
    (
    SELECT DISTINCT CONVERT(DATETIME, LEFT(MADATE, 8), 112) as MaDate
      FROM MaTable
    ) as SR
    ORDER BY month(MaDate) asc

  4. #4
    Membre du Club
    Homme Profil pro
    Médecin Département d'Information Médicale (DIM)
    Inscrit en
    Janvier 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Médecin Département d'Information Médicale (DIM)
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2009
    Messages : 115
    Points : 60
    Points
    60
    Par défaut
    Merci

    Pour Elkuset: malheureusement je ne souhaite PAS me compliquer la vie; mais des amateurs ont construit l'usine à gaz qui nous sert de SI, et c'est ainsi pour les formats de date...Comme pour le reste...Moi, j'essaye juste de faire mes requêtes

    Quant au modèle de données...Enfin, ce qu'on en déduit parce que rien n'est écrit...

    Ensuite avec une petite table où vous stockez la liste des mois de l'année et leur indice, une jointure des plus simples fait le reste, et en performances s'il vous plaît
    Cela me semble à moi aussi évident, mais ce n'est pas ce qui a été fait...

    Cordialement et merci

  5. #5
    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
    Citation Envoyé par Dr_No Voir le message
    Merci

    Cela me semble à moi aussi évident, mais ce n'est pas ce qui a été fait...
    Il n'est pas trop tard...

    si toutefois vous ne pouvez/voulez pas créer cette table, vous pouvez utiliser une CTE, ou directement une pseudo table :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    FROM MaTable
    INNER JOIN (
        SELECT 1 AS Rang, 'JANVIER' AS Mois
        UNION ALL
        SELECT 2, 'FEVRIER'
        UNION ALL 
        SELECT 3, 'MARS'
        ...
    ) T ON T.Mois = MaTable.UPPER(DATENAME(MONTH,dbo.F_VARCHAR_TO_DATETIME(MATABLE.MADATE))) 
    ...
    ORDER BY T.Rang

    Vous pouvez aussi écrire directement votre ORDER BY come ceci :
    Code SQL : 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
     
    SELECT DISTINCT 
        UPPER(
            DATENAME(
                MONTH,
                dbo.F_VARCHAR_TO_DATETIME(MATABLE.MADATE)
            )
        ) 
    FROM MATABLE
    ORDER BY     
        CASE     UPPER(
            DATENAME(
                MONTH,
                dbo.F_VARCHAR_TO_DATETIME(MATABLE.MADATE)
            )
        ) 
            WHEN 'JANVIER' THEN 1
            WHEN 'FEVRIER' THEN 2
            ...
            WHEN 'DECEMBRE' THEN 12
        END

    mais c'est sur que ce ne sont pas les solutions les plus propres...

  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 : 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
    @Dr_No : toutes mes excuses, vous êtes la victime, et je sais ce que c'est ...

    Amusez-vous à leur envoyer un lien vers mon post

    @++

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par elsuket Voir le message
    @Dr_No : toutes mes excuses, vous êtes la victime, et je sais ce que c'est ...
    Toutes mes condoléances.
    Je viens aussi de récupérer ce genre de pot de pue ces derniers jours...

  8. #8
    Membre du Club
    Homme Profil pro
    Médecin Département d'Information Médicale (DIM)
    Inscrit en
    Janvier 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Médecin Département d'Information Médicale (DIM)
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2009
    Messages : 115
    Points : 60
    Points
    60
    Par défaut
    ELsuket: A vrai dire , j'ai déjà envoyé des messages sur vos réponses à plusieurs de mes posts....

    J'y avais joint un conseil bibliographique sur les 'Stratégies Absurdes'

    Merci encore à tous de votre aide

    A la prochaine

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

Discussions similaires

  1. Faire un tri sur les mois
    Par emax2k dans le forum Designer
    Réponses: 8
    Dernier message: 21/11/2011, 11h40
  2. Tri sur un mois
    Par Kalas22 dans le forum Requêtes
    Réponses: 1
    Dernier message: 18/05/2011, 20h31
  3. Réponses: 0
    Dernier message: 21/06/2010, 17h58
  4. ACCESS 2003 : TRI sur le mois
    Par Eric26 dans le forum Access
    Réponses: 3
    Dernier message: 10/06/2006, 22h17
  5. Réponses: 12
    Dernier message: 31/03/2006, 21h02

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