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 :

Faire une différence de date sur une même table [MySQL-5.7]


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier Avatar de dark_vidor
    Homme Profil pro
    Élève
    Inscrit en
    Janvier 2005
    Messages
    321
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Élève

    Informations forums :
    Inscription : Janvier 2005
    Messages : 321
    Points : 118
    Points
    118
    Par défaut Faire une différence de date sur une même table
    Bonjour,
    Je souhaite faire sur une même table la différence entre deux dates suivant deux requêtes.
    J'ai réaliser cela en PHP/MySQL simplement en exécutant mes deux requêtes et en réalisant la différence des deux dates.

    Je voudrais savoir s'il est possible de tout faire dans une seule et même requête avec la fonction DATEDIFF.

    Voici la structure de ma table et les deux requêtes exécutée

    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
     
    --
    -- Structure de la table `table`
    --
     
    CREATE TABLE `table` (
      `id` int(10) UNSIGNED NOT NULL,
      `id_m` int(10) UNSIGNED NOT NULL,
      `date` datetime NOT NULL,
      `a` tinyint(4) NOT NULL,
      `b` tinyint(1) NOT NULL,
      `c` tinyint(1) NOT NULL,
      `d` smallint(6) NOT NULL
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
     
     
    SELECT date as date_1 FROM table WHERE id_m = 8 AND a >= 65 ORDER BY date LIMIT 1;
    date_1 : 2018-06-26 12:27:23
     
    SELECT date as date_2 FROM table WHERE id_m = 8 AND b = 1 AND c = 1 AND d <= 300 ORDER BY date LIMIT 1;
    date_2 : 2018-06-26 12:32:53
    Comment faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DATEDIFF( SECOND, date_1 , date_2 );
    qui me retourne 330 secondes ?

    Merci par avance.

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 106
    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 106
    Points : 28 393
    Points
    28 393
    Par défaut
    Dans un premier temps, tes requêtes avec LIMIT peuvent être avantageusement remplacées par l'usage d'une fonction de regroupement telle que MAX.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT  MAX(date) as date_1 
    FROM    table 
    WHERE   id_m = 8 
        AND a >= 65
    ;
    Ensuite, tu peux tout à fait utiliser ces sous-requêtes comme tables dérivées dans la clause FROM :
    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
    SELECT  DATEDIFF(SECOND, tb1.date_1 , tb2.date_2 )
    FROM    (   SELECT  MAX(date) as date_1 
                FROM    table 
                WHERE   id_m = 8 
                    AND a >= 65
            )   tb1
        CROSS JOIN
            (   SELECT  MAX(date) as date_2
                FROM    table 
                WHERE   id_m = 8 
                    AND b = 1 
                    AND c = 1
                    AND d <= 300
            )   tb2
    ;
    *

    Si id_m est une variable de la requête, tu pourrais utilement faire un regroupement sur cette colonne et une jointure entre les deux tables dérivées :
    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
    SELECT  DATEDIFF(SECOND, tb1.date_1 , tb2.date_2 )
    FROM    (   SELECT  id_m
                    ,   MAX(date) as date_1 
                FROM    table 
                WHERE   a >= 65
                GROUP BY id_m
            )   tb1
        INNER JOIN
            (   SELECT  id_m
                    ,   MAX(date) as date_2
                FROM    table
                WHERE   b = 1
                    AND c = 1
                    AND d <= 300
                GROUP BY id_m
            )   tb2
            ON  tb1.id_m = tb2.id_m
    WHERE   tb1.id_m = 8
    ;

  3. #3
    Membre régulier Avatar de dark_vidor
    Homme Profil pro
    Élève
    Inscrit en
    Janvier 2005
    Messages
    321
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Élève

    Informations forums :
    Inscription : Janvier 2005
    Messages : 321
    Points : 118
    Points
    118
    Par défaut
    Cela fonctionne parfaitement !
    Merci

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

Discussions similaires

  1. [Débutant] automatisation d'une saisie de date sur une page web
    Par ernie74 dans le forum VB.NET
    Réponses: 1
    Dernier message: 20/12/2016, 14h14
  2. Réponses: 2
    Dernier message: 01/01/2016, 14h00
  3. Réponses: 3
    Dernier message: 15/03/2012, 23h29
  4. Réponses: 2
    Dernier message: 09/01/2008, 14h39
  5. Réponses: 2
    Dernier message: 01/03/2007, 17h04

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