Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server
MS SQL-Server Forum Microsoft SQL-Server. Avant de poster -> FAQ SQL-Server, Tutoriels SQL-Server
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 26/05/2011, 15h37   #1
Futur Membre du Club
 
Homme
Médecin Département d'Information Médicale (DIM)
Inscription : janvier 2009
Messages : 77
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 : 77
Points : 18
Points : 18
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 :
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 :
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 :
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 :
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
Dr_No est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 15h53   #2
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 669
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2005
Messages : 4 669
Points : 8 729
Points : 8 729
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.

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 26/05/2011, 16h11   #3
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 434
Points : 10 434
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Comme ceci :
Code :
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
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 16h33   #4
Futur Membre du Club
 
Homme
Médecin Département d'Information Médicale (DIM)
Inscription : janvier 2009
Messages : 77
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 : 77
Points : 18
Points : 18
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...

Citation:
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
Dr_No est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 17h54   #5
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
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 :
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 :
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...
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 18h34   #6
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 669
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2005
Messages : 4 669
Points : 8 729
Points : 8 729
@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

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 19h12   #7
Expert Confirmé
 
Avatar de 7gyY9w1ZY6ySRgPeaefZ
 
Homme
dba
Inscription : juillet 2007
Messages : 2 520
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : dba

Informations forums :
Inscription : juillet 2007
Messages : 2 520
Points : 3 967
Points : 3 967
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...
__________________
les règles du forum - mode d'emploi du forum
Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs.
(Rappel : "ça ne marche pas" n'est pas un message d'erreur)
JE NE RÉPONDS PAS aux questions techniques par message privé.
Écrire en français sur un forum est une marque minimale de respect.
7gyY9w1ZY6ySRgPeaefZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2011, 10h00   #8
Futur Membre du Club
 
Homme
Médecin Département d'Information Médicale (DIM)
Inscription : janvier 2009
Messages : 77
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 : 77
Points : 18
Points : 18
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
Dr_No est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h50.


 
 
 
 
Partenaires

Hébergement Web