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 :

Requête sur un intervalle de date


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2019
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Novembre 2019
    Messages : 19
    Par défaut Requête sur un intervalle de date
    Bonjour,

    J'ai une requête, avec laquelle je travaille depuis plusieurs mois, qui ne m'a jamais posé de problèmes, sauf en septembre.
    Cette requête extrait les factures du mois précédent.
    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
     
    SELECT  
    ...
    po.invoice_number,
    po.invoice_date,
    ...
    FROM 
    ps_orders po, 
    ps_customer pc 
     
    WHERE 
    po.id_customer = pc.id_customer and
    po.invoice_date BETWEEN DATE_ADD(DATE_SUB(LAST_DAY(Date_sub(NOW(), interval 1 month)), interval 1 month), interval 1 day) and 
    DATE_ADD(LAST_DAY(Date_sub(NOW(), interval 1 month)), interval 1 day)
     
    ORDER BY
    po.invoice_date, po.invoice_number

    En octobre, le résultat de la requête affiche bien toutes les factures de septembre, mais aussi celles du 31 août (!!).
    Nom : presta.jpg
Affichages : 402
Taille : 852,8 Ko

    Je ne vois pas du tout ce qu'il faudrait reprendre dans la requête.
    Auriez-vous une suggestion ?

    Merci !!

    Goo

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 544
    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 544
    Billets dans le blog
    10
    Par défaut
    Voici comment récupérer la date de début du mois précédent, quelle que soit la durée du mois (28, 29, 30 ou 31 jours) :

    select date_add(last_day(date_add(@ma_date, interval -2 month)), interval 1 day) as DEB ;.

    Et par voie de conséquence, pour le dernier jour du mois :

    select last_day(date_add(last_day(date_add(@ma_date, interval -2 month)), interval 1 day)) as FIN.

  3. #3
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2019
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Novembre 2019
    Messages : 19
    Par défaut
    escartefigue,

    Voici comment je viens d'adapter ta proposition :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    WHERE po.id_customer = pc.id_customer 
      and po.invoice_date BETWEEN date_add(last_day(date_add(NOW(), interval -2 month)), interval 1 day)
                              and last_day(date_add(last_day(date_add(NOW(), interval -2 month)), interval 1 day))
    Ca fonctionne parfaitement !

    Un grand merci à toi !

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    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 132
    Par défaut
    Au passage, cela fait des lustres qu'on utilise l'opérateur JOIN pour effectuer les jointures et plus une restriction sur un produit cartésien.
    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
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 778
    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 778
    Par défaut
    Salut à tous.

    Mysql sait faire des opérations sur les dates, sans passer par les fonctions date_add() et date_sub().
    Code mysql : 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
    66
    67
    68
    69
    70
    71
    --------------
    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,
      `date`  date              NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    INSERT INTO `test` (`date`) values
      ('2022-08-31'),('2022-09-01'),('2022-09-30'), ('2022-10-01')
    --------------
     
    --------------
    SELECT * FROM `test`
    --------------
     
    +----+------------+
    | id | date       |
    +----+------------+
    |  1 | 2022-08-31 |
    |  2 | 2022-09-01 |
    |  3 | 2022-09-30 |
    |  4 | 2022-10-01 |
    +----+------------+
    --------------
    SELECT last_day(now() - interval 2 month) + interval 1 day AS debut,
           last_day(now() - interval 1 month)                  AS fin
    --------------
     
    +------------+------------+
    | debut      | fin        |
    +------------+------------+
    | 2022-09-01 | 2022-09-30 |
    +------------+------------+
    --------------
    SELECT *
      FROM `test`
     WHERE `date` BETWEEN last_day(now() - interval 2 month) + interval 1 day AND last_day(now() - interval 1 month)
    --------------
     
    +----+------------+
    | id | date       |
    +----+------------+
    |  2 | 2022-09-01 |
    |  3 | 2022-09-30 |
    +----+------------+
    --------------
    COMMIT
    --------------
     
    Appuyez sur une touche pour continuer...
    L'idée reste la même, mais l'écriture est plus courte.

    Cordialement.
    Artemus24.
    @+

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 544
    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 544
    Billets dans le blog
    10
    Par défaut
    Effectivement Artemus24 c'est plus simple ainsi
    Certes c'est spécifique à MySQL, donc peu portable, mais de toute façon les fonctions date le sont rarement d'un SGBD à l'autre, donc autant simplifier

  7. #7
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2019
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Novembre 2019
    Messages : 19
    Par défaut
    Thanks a lot pour cette version actualisée Artemus24. Cependant, la requête ne passe pas sous le vieux Prestashop utilisé au boulot.

    La bonne journée !

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 01/06/2015, 20h46
  2. requête sur un intervale de date
    Par hi-wave dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 28/06/2012, 20h23
  3. Requêtes sur des intervalles de dates
    Par Tidus159 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 09/05/2011, 16h43
  4. Requête sur une plage de date
    Par altecad dans le forum Requêtes
    Réponses: 1
    Dernier message: 23/05/2007, 15h11
  5. Requêtes sur enregistrements avec critères dates
    Par Aliveli dans le forum Access
    Réponses: 10
    Dernier message: 05/06/2006, 13h41

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