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

PHP & Base de données Discussion :

[SQL] Comparaison heure PHP et heure SQL


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 78
    Points : 48
    Points
    48
    Par défaut [SQL] Comparaison heure PHP et heure SQL
    Bonjour

    Voila je m'explique je stoque une date et heure dans une base de donnée mysql (type de donnée timestamp) et dans une page je voudrais calculer le temps ecouler entre l'heure stoqué dans la base de donnée et l'heure actuel. Mais le probleme c'est que quand je recupere l'heure de la base de donnée j'ai une chaine de caractere ... comment je peux faire svp ?

  2. #2
    Membre actif Avatar de Mogwaï
    Inscrit en
    Mai 2004
    Messages
    247
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2004
    Messages : 247
    Points : 278
    Points
    278
    Par défaut
    Essaie quelque chose du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT DATEDIFF(NOW(), `tonchampdatetime`) FROM `tatable` where ...
    De plus amples informations ici :
    http://dev.mysql.com/doc/refman/5.0/...functions.html
    Etre à son compte, y'a rien de mieux !

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 78
    Points : 48
    Points
    48
    Par défaut
    Je n'arrive pas a utiliser sa dans mon script php :s

    voila mon code mais j'immagine que pour utliser ce genre de fonction il ne faut pas faire comme sa ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $aaa=mysql_query("SELECT DATEDIFF(NOW(), `date`)  FROM `personnage` where perso='$nomperso'");
     
    echo "diff = $aaa";

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    572
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Juin 2005
    Messages : 572
    Points : 716
    Points
    716
    Par défaut
    mysql_query renvoit un résultat de requête, en aucun cas un enregistrement de la base.
    Il te manque donc une étape :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $result=mysql_query("SELECT DATEDIFF(NOW(), `date`) as ecart_date  FROM `personnage` where perso='$nomperso'");
     
    $aaa = mysql_fetch_array($result);
    echo "diff = ".$aaa['ecart_date'];
    Tout pas mieux que tout le monde : évitez les questions techniques en mp sinon à quoi bon poster sur un forum ?

    Petite citation : "Le sage cherche la vérité, l'imbécile l'a déjà trouvée"

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 78
    Points : 48
    Points
    48
    Par défaut
    la requete sql marche pas ....

    ma table s'appelle "personnage"
    dans personnage il y a une ligne "maj" qui est de type timestamp
    Mon but est de voir combien de temps s'est ecouler depuis l'heure stocker dans "maj"


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $result=mysql_query("SELECT DATEDIFF(NOW(), maj) as ecart_date  FROM `personnage` where perso='$nomperso'")or die("ERREUR");
     
    $aaa = mysql_fetch_array($result);
    echo "diff = ".$aaa['ecart_date'];
    ce code m'afficher ERREUR la requete ne marche pas :s

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 778
    Points
    17 778
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $result=mysql_query("SELECT UNIX_TIMESTAMP - maj as ecart_date  FROM `personnage` where perso='" . mysql_real_escape_string($nomperso) . "'") or die("ERREUR");
    echo mysql_result($result, 0, 0);
    Ne serait-ce pas suffisant ?

    Citation Envoyé par mello
    Mais le probleme c'est que quand je recupere l'heure de la base de donnée j'ai une chaine de caractere ...
    Une chaîne de caractères ?

  7. #7
    Membre averti Avatar de Linio
    Inscrit en
    Octobre 2005
    Messages
    431
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 431
    Points : 332
    Points
    332
    Par défaut
    Oui c'est ce qu'on récupère en php quand on fait une requête Mysql sur les champs date ou heure. (Bien chiant d'ailleurs)
    Linio

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Points : 376
    Points
    376
    Par défaut
    julp, j'utilise le code que tu proposes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $result=mysql_query("SELECT CURRENT_TIMESTAMP - date_connexion as duree_connexion ...
    J'affiche le résultat et j'obtiens un phénomène bizarre:

    tant que CURRENT_TIMESTAMP et date_connexion sont dans la même minute, cela fonctionne. Quand CURRENT_TIMESTAMP change de minute, l'écart fait un saut inexpliqué (d'une quarantaine de secondes).

    J'utilise EasyPhp 1.8 pour mes tests. Est-ce un bug lié à cette version ?

    Sinon, comment calculer l'écart entre un champ mysql TIMESTAMP récupéré dans une variable $date_connexion et une date PHP récupérée par date() par exemple ?

  9. #9
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 778
    Points
    17 778
    Par défaut
    Citation Envoyé par josse95
    tant que CURRENT_TIMESTAMP et date_connexion sont dans la même minute, cela fonctionne. Quand CURRENT_TIMESTAMP change de minute, l'écart fait un saut inexpliqué (d'une quarantaine de secondes).
    Comment ça ? Il n'y normalement aucune différence entre les deux tant que les serveurs sont sur la même machine (à moins d'un mécanisme de synchronisation) mis à part le temps de traitement du code PHP et d'exécution de la requête puisque vous dites utiliser la fonction date() (c'est bien un timestamp que vous demandez ?). En effet, la "fonction" CURRENT_TIMESTAMP ne sera substituée par sa valeur qu'à l'exécution de la requête par MySQL. Mais 40 secondes d'écart c'est beaucoup quand même !

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Points : 376
    Points
    376
    Par défaut
    Oui, effectivement, c'est beaucoup et je ne comprends pas.
    date_connexion est le champ de ma base MySQL initialisé lors de la connexion.

    Je fais le select CURRENT_TIMESTAMP-date_connexion à intervalles plus ou moins réguliers (j'utilise le bouton rafraîchir du navigateur. Mon but est de mettre en place une durée maximum de session). L'écart augmente de quelques secondes à chaque fois puis augmente brusquement d'une quarantaine de secondes lorsque l'horloge du PC passe à la minute suivante (j'affiche l'horloge en parallèle).

    Pour l'instant, j'hésite à migrer sous EasyPhp 2 (c'est une version bêta et je sens que je risque de passer du temps à faire la migration ...).

    C'est la raison pour laquelle je souhaite, comme mello dans son message initial, utiliser directement le champ MySQL avec les fonctions Php de traitement de date. Y a t'il un moyen simple pour le faire ?

  11. #11
    Membre averti Avatar de jota5450
    Inscrit en
    Janvier 2006
    Messages
    263
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Janvier 2006
    Messages : 263
    Points : 332
    Points
    332
    Par défaut
    slt...

    Pour savoir l´ecart entre 2 dates

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select timediff(CURRENT_TIMESTAMP ,date_connexion) as duree_connexion ....

    et quand a date_connexion.. c´est quoi au juste?
    la date de quand tu fais la connexion? mais quand est ce que tu l´enregistre?
    parce que si tu l´enregistre au debut, biensur que a chaque fois, l´ecart augmente.

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Points : 376
    Points
    376
    Par défaut
    Merci, je vais essayer.

    Bien-sûr qu'il est normal que l'écart augmente. Mais là, il augmente linéairement avec le temps (normal) sauf quand il y a un changement de minute où là il y a une discontinuité. Au lieu d'augmenter de quelques secondes (intervalle entre deux rafraichissements), il augmente brusquement de 40 secondes.

    Entre-temps, j'ai fait ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    duree_connexion = time()-strtotime($result['date_connexion']);
    et je n'ai plus le problème que j'avais avec le select(CURRENT_TIME_STAMP-date_connexion ...).

  13. #13
    Membre éprouvé Avatar de fenkys
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    376
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 376
    Points : 1 054
    Points
    1 054
    Par défaut
    Julp, tu as confondu UNIX_TIMESTAMP et CURRENT_TIMESTAMP

    UNIX_TIMESTAMP renvoie un timestamp facon Unix c'est a dire un nombre de seconde écoulé depuis une certaine date (1-1-1970 je crois).

    CURRENT_TIMESTAMP renvoie une valeur construite ainsi YYYYMMDDHHMMSS

    Cela explique les sauts brutaux de 40 secondes toutes les minutes. Je te laisse deviner la cata que ca aurait donné le 31-12 d'une année quelconque à 23h59:59.

    ref : http://dev.mysql.com/doc/refman/5.0/...functions.html

Discussions similaires

  1. Réponses: 2
    Dernier message: 13/01/2015, 08h56
  2. [PL/SQL] Heure d'été / Heure d'hiver
    Par arnauann dans le forum SQL
    Réponses: 7
    Dernier message: 11/07/2014, 11h14
  3. [SQL] Menu deroulant PHP dynamique requete SQL
    Par pit2121 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 21/12/2007, 16h16
  4. Forcer date, heure et seconde sous sql server2000
    Par sorel dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 12/05/2005, 18h49
  5. Heur et date serveur sql
    Par adgabd dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 01/12/2003, 16h16

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