Fonctions de date/heure en MySQL


précédentsommairesuivant

Horaires Glissants, Tranches Horaires

Enoncé du problème
On désire créer un site de jeux en ligne. Voici les règles :

- Le site propose plusieurs jeux.
- Un joueur peut jouer à un jeu si il n'a jamais joué à ce jeu ou si il s'est écoulé un temps suffisamment long depuis sa dernière participation.


On a deux méthodes de calcul pour déterminer si le temps qui s'est écoulé entre deux participations est suffisamment long : "intervalles glissants" et "par tranches horaires".

Avec la méthode intervalles glissants si le joueur joue à 14h25 et que l'intervalle est fixé à 1 heure, il pourra rejouer à 15h35.

Avec la méthode par tranches horaires si le joueur joue à 14h25 et que l'intervalle est fixé par tranches d'1 heure, il pourra rejouer à 15h00.



Pour représenter ce problème, on dispose des tables suivantes :

  • Joueur : les joueurs
  • Jeu : les jeux, avec stipulé : la méthode de calcul utilisée, de type: ENUM("Glissant", "Tranche_Horaire")le délai entre deux parties, exprimé en secondes
  • Participe_Jeu : heure de dernière participation d'un joueur à un jeu.
Script de création
Sélectionnez
CREATE TABLE joueur (
  idJoueur     INT UNSIGNED      NOT NULL AUTO_INCREMENT,
  nom          CHAR(30)          NOT NULL,
  
  PRIMARY KEY (idJoueur)
) ;



CREATE TABLE jeu (
  idJeu        INT UNSIGNED      NOT NULL AUTO_INCREMENT,
  nom          CHAR(30)          NOT NULL,
  description  CHAR(255)         NOT NULL,
  delaiMinSec  INT UNSIGNED      NOT NULL,
  methCalcul   ENUM("Glissant", "Tranche_Horaire") NOT NULL,

  PRIMARY KEY (idJeu)
) ;




CREATE TABLE participe_jeu (
  idJoueur       INT UNSIGNED NOT NULL,
  idJeu          INT UNSIGNED NOT NULL,
  heureParticipe DATETIME,

  PRIMARY KEY (idJoueur, idJeu),
 
  CONSTRAINT FOREIGN KEY fk_idJoueur (idJoueur) REFERENCES joueur(idJoueur),
  CONSTRAINT FOREIGN KEY fk_idJeu    (idJeu)    REFERENCES client(idJeu)
) ;



La requête

Pour des raisons de simplicité, nous avons choisi la méthode suivante :

  • la requête SQL nous renseignera sur l'heure actuelle (heure du serveur MySQL) et l'heure de dernière participation à un jeu. Ces heures seront retournées sous forme de UNIX_TIMESTAMP.
  • C'est l'application qui calculera le temps d'attente avant la prochaine participation. Si ce temps est négatif ou nul, alors il est possible de participer immédiatement.

Voici la requête qui va nous donner la liste des dernières participations du joueur numéro 12 :

 
Sélectionnez
SELECT 
  jeu.*,
  UNIX_TIMESTAMP( NOW() )                      AS ts_actuel,
  UNIX_TIMESTAMP(participe_jeu.heureParticipe) AS ts_participe

FROM jeu

LEFT OUTER JOIN participe_jeu 
ON  (participe_jeu.idJeu=jeu.idJeu AND participe_jeu.idJoueur=12)



Le résultat renvoyé est du genre :

idJeu nom description delaiMinSec methCalcul ts_actuel ts_participe
1 Jeu 1 Jeu 1 3600 Glissant 1138455932 1138448285
2 Jeu 2 Jeu 2 3600 Tranche_Horaire 1138455932 NULL
3 Jeu 3 Jeu 3 86400 Tranche_Horaire 1138455932 1138448285



Et voici la fonction (PHP) qui va nous permettre de calculer le temps d'attente avant la nouvelle partie :

Calcul du temps d'attente
Sélectionnez

function tempsAttente($methCalcul, $ts_actuel, $ts_participe, $delaiMinSec) {

  $tempsAttente = 0 ;

  if (!is_null($ts_participe)) {

    if ($methCalcul == "Tranche_Horaire") {

      $tempsAttente =
        $ts_participe - $ts_participe % $delaiMinSec
        + $delaiMinSec
        - $ts_actuel ;

    } else {
       # Glissant par défaut

       $tempsAttente =
         $ts_participe
         + $delaiMinSec
         - $ts_actuel ;
    }          

  }

  return $tempsAttente ;
}



Pour les intervalles glissants, il suffit d'ajouter et de soustraire des intervalles de temps. Pour le calcul par tranches horaires on utilise l'opérateur modulo (%) avec le délai minimum, exprimé en secondes.


précédentsommairesuivant

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

  

Copyright © 2006 Pierre Caboche. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.