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

Langage SQL Discussion :

Problème classement par date


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 28
    Points : 14
    Points
    14
    Par défaut Problème classement par date
    Bonjour,

    Mon problème semble être assez simple, mais il me manque une pièce du puzzle...
    J'aimerai en effet classer une table par date, sans tenir compte de l'année, et en prenant comme origine la date d'aujourd'hui.
    Exemple :
    PRENOM | DATE ANNIF

    Alex | 1945-06-20
    Emilie | 1980-05-01
    Jerome | 1937-09-05

    Donnerait,aujourd'hui 27 aout :
    Jerome : 1937-09-05
    Emilie : 1980-05-01
    Alex : 1945-06-20

    Merci d'avance...

  2. #2
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Quel moteur, quelle version, quel est le type de la colonne DATE ANNIF ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 28
    Points : 14
    Points
    14
    Par défaut version ...
    Alors, le type de la colonne date_annif est "date".
    Pour le moteur, si j'ai bien compris, c'est Mysql, dans sa version 4.1.13.

    Merci encore

  4. #4
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Je n’ai pas accès à mySQL, donc sans garantie, mais voilà comment je ferais :

    1) Transformation de toutes les dates en 2000 (année bissextile), y compris la date du jour (attention, il ne faut pas passer par le N° de jour, car les années bissextiles perturberaient le calcul, il faut faire un truc du genre '2000-' + Month +'-' + Day).
    2) Transformation des dates précédentes (da, comme date_annif dans la suite) en N° de jour (DAYOFYEAR), y compris la date du Jour mis en 2000 (dj dans la suite)
    3) Faire ORDER BY MOD(da – dj + 366, 366)

    (le +366 est là pour éviter le 'bug' habituel sur la fonction modulo qui peut ramener des nombres négatifs (c'est le cas d'ORACLE))

    Tout ceci doit pouvoir se faire en un seul SELECT, mais je ne connais pas les fonction mySQL

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 849
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 849
    Points : 52 975
    Points
    52 975
    Billets dans le blog
    6
    Par défaut
    En SQL normatif :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM   MaTable
    ORDER  BY EXTRACT(MONTH FROM  DATE_ANNIF) * 100 + EXTRACT(DAY FROM  DATE_ANNIF)
    A +

  6. #6
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    SQLPro, je ne pense pas que ta requête réponde complètement à la question
    en prenant comme origine la date d'aujourd'hui :
    ce que j'ai compris comme "la date d'aujourd'hui doit être la première dans l'ORDER BY"

    Sous SQLServer (le + 366 est obligatoire) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select * 
    from laTable
    order by (datediff(day,
                       dateadd(day, day(getdate())  - 1, dateadd(month, month(getdate())  - 1, '2000-01-01')),
                       dateadd(day, day(date_annif) - 1, dateadd(month, month(date_annif) - 1, '2000-01-01'))) + 366)
             % 366
    [Edit]
    Correction pour ajouter les -1
    [/Edit]

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 28
    Points : 14
    Points
    14
    Par défaut Ouah
    Merci beaucoup pour votre réponse!!! J'avoue, je n'aurais jamais trouvé cela, pourtant j'avais chercher...
    Je teste, et si ça marche j'essai de tout comprendre

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 849
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 849
    Points : 52 975
    Points
    52 975
    Billets dans le blog
    6
    Par défaut
    alors il suffit de sousatraire le mois courant *100 et le jour courant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT *
    FROM   MaTable
    ORDER  BY EXTRACT(MONTH FROM  DATE_ANNIF) * 100 + EXTRACT(DAY FROM  DATE_ANNIF) 
            - EXTRACT(MONTH FROM CURRENT_DATE) * 100 - EXTRACT(DAY FROM CURRENT_DATE)
    A +

  9. #9
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Une soustraction ne modifie pas l'ordre !

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 28
    Points : 14
    Points
    14
    Par défaut oups
    Malheuresement, quand j'ai testé, voici la réponse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     Erreur SQL !
    select * from anniversaires order by ( datediff(day,dateadd("d", day(getdate()) , dateadd(month, month(getdate()) , '2000-01-01')), dateadd("d", day(date_annif), dateadd(month, month(date_annif), '2000-01-01'))) + 366) % 366
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '("d", day(getdate()) , dateadd(month, month(getdate()) , '2000-01-01')), dateadd' at line 3
    Pourtant, j'ai fait du copier/coller en attendant de mieux comprendre la requete. Après quelques recherches, je m'orienterais plus vers une erreur avec "dateadd"....

  11. #11
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Comme je l'ai indiqué, j'ai utilisé des fonctions SQLServer, il faut que tu les remplaces par des fonctions mySQL (dont je ne dispose pas)

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 28
    Points : 14
    Points
    14
    Par défaut Recherche en cours
    Effectivement, j'essai depuis un certain temps d'adapter la chose en MySql... sans succès, pour l'instant.
    Mais pourrait-on m'expliquer le principe de cette requête ?
    En effet, au début, je pensais simplement classer les résultats par nombre de jour d'écart entre aujourd'hui et la date en question, mais cela ne semble pas fonctionner.
    Pourquoi ajouter 2000-01-01 ? et 366 ?
    Merci encore

  13. #13
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Tu passes toutes tes dates en 2000, par exemple 12/02/2005 --> 12/02/2000, pourquoi 2000 ? simplement parce qu'il faut une année bisextile afin de ne pas être embêté par le 29/02.

    Toutes tes dates sont ramenées à une année fixe, elle sont donc dans le bon ordre, sauf que cela ne commence pas au bon endroit !

    Tu transforme les dates précédentes en nombre de jours depuis le 1er Janvier, l'ordre est conservé, pour démarrer à aujourd'hui, tu soustrais à tous tes nombres le N° d'aujourdhui, tes dates sont devenues, par exemple :
    -10, -5, 0, 5, 10
    tu ajoutes 366 :
    356, 361, 366, 371, 376
    tu prends modulo 366 :
    356, 361, 0, 5, 10
    et tu vois que les deux premières valeurs vont passer derrière : c'est gagné

Discussions similaires

  1. problème filtrage par date
    Par master_och dans le forum JDBC
    Réponses: 9
    Dernier message: 07/04/2009, 23h15
  2. RecordSet classement par date
    Par Linio dans le forum ASP
    Réponses: 9
    Dernier message: 21/05/2008, 20h55
  3. [MySQL] Classement par date
    Par gunth dans le forum PHP & Base de données
    Réponses: 16
    Dernier message: 15/02/2008, 18h04
  4. problème classement de date dans une requête
    Par heteroclite dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 15/10/2006, 15h55
  5. [Conception] Classement par date et id : donner la priorité
    Par psychoBob dans le forum PHP & Base de données
    Réponses: 12
    Dernier message: 01/02/2006, 15h04

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