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 :

Comment convertir un nombre de jours décimal en date


Sujet :

Requêtes MySQL

  1. #1
    Membre averti Avatar de Soutou
    Profil pro
    Inscrit en
    janvier 2005
    Messages
    328
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : janvier 2005
    Messages : 328
    Points : 378
    Points
    378
    Par défaut Comment convertir un nombre de jours décimal en date
    --Bonjour à tous les PRO de MySQL

    -- question : Comment convertir un nombre de jours décimal : ex 14,5
    -- au format 'jour heures : minutes : secondes' ici '14 j 12 h 0 min 0 sec'
    -- ce nombre peut être grand > 1000 voire plus

    -- script qui extrait un nombre décimal et qui n'arrive pas à le passer
    -- en format date (DATETIME ou TIMESTAMP, TIME trop petit)

    DROP TABLE Pilote;
    CREATE TABLE Pilote
    (nom VARCHAR(20), dateNaiss DATETIME, dateEmbauche DATETIME);

    INSERT INTO Pilote VALUES ('C. Soutou','1965-02-05',SYSDATE());

    SELECT * FROM Pilote;

    --Différence en jours (entier) entre dateNaiss et dateEmbauche

    SELECT DATEDIFF(dateEmbauche,dateNaiss) "jour entier" FROM Pilote;

    --Différence en jours (avec décimales) entre dateNaiss et dateEmbauche

    SELECT TIMESTAMPDIFF(SECOND,dateNaiss,dateEmbauche)/(24*3600) "jour decimales" FROM Pilote;

    --au format : 'jours heures : minutes : secondes' ???


    DROP TABLE Pilote;

  2. #2
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Singapour

    Informations forums :
    Inscription : octobre 2005
    Messages : 2 785
    Points : 9 687
    Points
    9 687
    Par défaut Re: Comment convertir un nombre de jours décimal en date
    Citation Envoyé par Soutou
    --Bonjour à tous les PRO de MySQL

    -- question : Comment convertir un nombre de jours décimal : ex 14,5
    -- au format 'jour heures : minutes : secondes' ici '14 j 12 h 0 min 0 sec'
    -- ce nombre peut être grand > 1000 voire plus
    Au lieu de prendre 14.5, j'ai pris -14.6 comme exemple, parce que:
    - c'est négatif
    - la fraction n'est pas en 0.5 (problèmes d'arrondis)

    J'ai essayé la formule suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT CONCAT( 
       SIGN(-14.6) * FLOOR(ABS(-14.6)),
       " j ", 
       SEC_TO_TIME((ABS(-14.6)-FLOOR(ABS(-14.6)))* 86400) 
    ) AS DifferenceTemps
    et j'obtiens ça:

    J'espère que ça pourra aider. J'attends vos remarques (optimisations, éventuelles corrections), surtout si vous trouvez une manière plus simple de gérer les arrondis.


    Citation Envoyé par Soutou
    --Différence en jours (entier) entre dateNaiss et dateEmbauche

    SELECT DATEDIFF(dateEmbauche,dateNaiss) "jour entier" FROM Pilote;
    Il faut juste faire attention car la fonction DATEDIFF n'est disponible qu'à partir de la version 4.11 de MySQL. Pour les versions antérieures, j'ai une solution alternative: http://www.developpez.net/forums/viewtopic.php?t=405900
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  3. #3
    Membre averti Avatar de Soutou
    Profil pro
    Inscrit en
    janvier 2005
    Messages
    328
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : janvier 2005
    Messages : 328
    Points : 378
    Points
    378
    Par défaut
    Oui ça marche bien, il faudra ensuite manipuler la chaîne obtenue par CONCAT. C'est un manque de MySQL à mon sens de ne pas proposer de type INTERVAL comme Oracle le fait. TIME ne va que de -839 h à +839h.
    Qu'en penses-tu?
    Merci bien.

  4. #4
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Singapour

    Informations forums :
    Inscription : octobre 2005
    Messages : 2 785
    Points : 9 687
    Points
    9 687
    Par défaut
    En fait, tu as deux solutions:
    - soit manipuler la chaine pour exploiter le résultat
    - soit modifier la requête SQL pour qu'elle renvoie le résultat escompté

    Personnellement, je suis plutôt adepte de la deuxième solution: la requête sera peut-être un peu plus longue, mais en contrepartie on aura moins de code à écrire (plus clair, moins de risque d'erreurs)

    Le CONCAT a d'ailleurs été utilisé dans cette optique (récupérer une chaine dans le format désiré). Maintenant, il faut s'amuser un peu avec la fonction TIME_FORMAT pour obtenir le résultat escompté :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT CONCAT(
       SIGN(14.5) * FLOOR(ABS(14.5)),
       " j ",
     
       TIME_FORMAT(
         SEC_TO_TIME((ABS(14.5)-FLOOR(ABS(14.5)))* 86400),
         '%H h %m min %s sec'
       )
     
    ) AS DifferenceTemps

    Et le résultat obtenu est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    14 j 12 h 00 min 00 sec
    Je suis ravi d'avoir pu t'apporter une solution. Si tu trouves un moyen de l'améliorer d'une quelconque façon, pense à mettre à jour ce sujet (je suis allé au plus vite pour que tu ne soit pas bloqué avec ton problème, mais il existe peut-être un formule plus simple, avec des modulos par exemple).



    Concernant MySQL, je suis déjà bien content qu'il existe un SGBD gratuit avec des performances et des fonctionnalités tout à fait correctes. Certes, il manque encore pas mal de fonctionnalités (comme celle que tu as mentionnée, ou encore l'opération MINUS entre deux SELECT), mais de nouvelles sont implémentées au fil des versions.

    Ce qui me dérange plus, c'est que les entreprises qui recrutent recherchent à tout prix des spécialistes Oracle avec plusieurs années d'expérience dans ce domaine. Quand on voit les trésors d'ingéniosité qu'il faut parfois déployer pour pallier à certaines fonctionnalités manquantes de MySQL, on se dit que les entreprises pourraient être un peu plus indulgeante avec les ingénieurs qui sortent de l'école... Mais c'est un avis personnel.
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 11/12/2014, 10h52
  2. [AC-2007] comment convertir un nombre format 20120101 en format date
    Par arabi91 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 23/03/2012, 16h53
  3. Comment calculer le nombre de jours entre deux dates
    Par pierrot10 dans le forum Langage
    Réponses: 8
    Dernier message: 22/06/2011, 08h38
  4. Comment définir le nombre de jours entre 2 dates
    Par Bouom771 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 05/02/2008, 00h35
  5. Réponses: 2
    Dernier message: 29/05/2006, 19h16

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