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

Requêtes MySQL Discussion :

MAX entre 2 dates + WHERE


Sujet :

Requêtes MySQL

  1. #1
    Membre actif
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Points : 271
    Points
    271
    Par défaut MAX entre 2 dates + WHERE
    Bonjour,

    j'ai un souci sur une requête... Je souhaite trier sur la colonne max de 2 dates. Mais sur tous mes tests, MySQL m'indique des erreurs de syntaxe.

    Celle-ci fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT id, codification, version, modification, desactivation 
    FROM document 
    WHERE (CASE WHEN desactivation>=modification THEN desactivation ELSE modification END) > '2019-07-01';
    mais pas celle là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT id, codification, version, modification, desactivation, 
    CASE WHEN desactivation>=modification THEN desactivation ELSE modification END AS last_change
    FROM document 
    WHERE last_change > '2019-09-01'
    ORDER BY last_change DESC;
    J'ai l'erreur :
    2 erreurs trouvées lors de l'analyse.
    Mot clé non reconnu. (near "AS" at position 144)
    Jeton inattendu. (near "last_change" at position 147)
    #1054 - Champ 'last_change' inconnu dans where clause
    Une idée ?
    Merci d'avance pour votre aide

  2. #2
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2014
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2014
    Messages : 257
    Points : 397
    Points
    397
    Par défaut
    Bonjour,

    Comme la première erreur l'indique, mysql plante sur votre alias de clause CASE. En effet, vous faites un "end as monNomDeCase" mais il me semble que mysql ne veuille pas du "AS"
    Essayez déjà votre requête sans ce "AS" et voyez ce que ca donne

    Bisous bisous

  3. #3
    Membre actif
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Points : 271
    Points
    271
    Par défaut
    bah ça marche mais du coup je ne peux plus filtrer et trier...

  4. #4
    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 802
    Points
    30 802
    Par défaut
    Tu peux peut-être utiliser un alias dans la clause ORDER BY, en revanche ce n'est pas possibe dans la clause WHERE.
    Il faut donc que tu y copies l'expression correspondante.
    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.

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Regardez aussi du côté de la fonction GREATEST.

  6. #6
    Membre actif
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Points : 271
    Points
    271
    Par défaut
    Merci à vous !
    j'ai cette requête qui semble répondre à mon besoin :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT id, codification, version, creation, modification, desactivation, 
    LEFT( GREATEST(creation, COALESCE(modification,''), COALESCE(desactivation,'')), 19) AS last_change
    FROM document  
    WHERE GREATEST(creation, COALESCE(modification,''), COALESCE(desactivation,'')) > '2019-07-01'
    ORDER BY `last_change`  DESC
    COALESCE est utilisé pour gérer les dates NULL...
    LEFT est utilisé pour retirer le ".00000" de last_change (ex : 2019-10-18 13:30:46.000000) ????


  7. #7
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 066
    Points
    19 066
    Par défaut
    Salut Tchupacabra.

    Citation Envoyé par Tchupacabra
    LEFT est utilisé pour retirer le ".00000" de last_change (ex : 2019-10-18 13:30:46.000000) ????
    Ce n'est pas une erreur. Votre date est du type "timestamp".
    Avez-vous besoin d'avoir le type TIMESTAMP ? Pourquoi ne pas mettre tout simplement "datetime" ?

    Citation Envoyé par Tchupacabra
    j'ai un souci sur une requête...
    a) Votre problème de syntaxe "Mot clé non reconnu. (near "AS" at position 144)" peut venir de la version MySql que vous utilisez.
    Dans une version plus récente, comme MySql 8.0, cette syntaxe est correcte.
    Il faudrait songer à faire évoluer votre version MySql.

    b) vous manipulez des dates mais le test que vous faites est incorrecte. Pourquoi ?
    Si comme je le suppose le format est date+time, vous ne devez pas mettre que la date mais aussi l'heure.
    Le test devient : > "2018-21-31 23:59:59".

    c) si vous avez une erreur sur la colonne "last_change" de la clause where, votre problème est que vous utilisez la mauvaise clause.
    Il faut dans ce cas utilisez la clause having.

    Voici un exemple :
    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE IF NOT EXISTS `base`
            DEFAULT CHARACTER SET `latin1`
            DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `test`
    --------------
     
    --------------
    create table `test`
    (  `id`             integer unsigned  not null auto_increment primary key,
       `modification`   datetime          not null,
       `desactivation`  datetime          not null
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `test` (`modification`,`desactivation`) values
      ('2018-12-31- 16:30:00','2018-12-31 14:00:00'),
      ('2019-01-01- 16:30:00','2019-01-01 15:28:00'),
      ('2019-01-02- 16:30:00','2019-01-02 17:45:00')
    --------------
     
    --------------
    select * from `test`
    --------------
     
    +----+---------------------+---------------------+
    | id | modification        | desactivation       |
    +----+---------------------+---------------------+
    |  1 | 2018-12-31 16:30:00 | 2018-12-31 14:00:00 |
    |  2 | 2019-01-01 16:30:00 | 2019-01-01 15:28:00 |
    |  3 | 2019-01-02 16:30:00 | 2019-01-02 17:45:00 |
    +----+---------------------+---------------------+
    --------------
    select    id,
              case when desactivation>=modification then desactivation else modification end as last_change
        from  `test`
      having  last_change > '2018-12-31 23:59:59'
    order by  last_change desc
    --------------
     
    +----+---------------------+
    | id | last_change         |
    +----+---------------------+
    |  3 | 2019-01-02 17:45:00 |
    |  2 | 2019-01-01 16:30:00 |
    +----+---------------------+
    --------------
    COMMIT
    --------------
     
    Appuyez sur une touche pour continuer...
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

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

Discussions similaires

  1. Sélectionner la date max entre deux requêtes
    Par ibox53 dans le forum Access
    Réponses: 3
    Dernier message: 30/06/2015, 10h25
  2. [Débutant] CompareValidator : écart max entre deux champs date
    Par Yosko dans le forum ASP.NET
    Réponses: 4
    Dernier message: 08/08/2011, 16h28
  3. le max entre 2 date
    Par john_wili dans le forum SQL
    Réponses: 2
    Dernier message: 28/07/2009, 13h51
  4. Clause WHERE pour SELECT entre deux dates
    Par arogues dans le forum Langage SQL
    Réponses: 8
    Dernier message: 17/04/2008, 17h42
  5. max entre 2 dates
    Par morados dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 09/07/2007, 20h13

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