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

Développement SQL Server Discussion :

Convertir des secondes en hh:mm:ss lorsque l'on dépasse 24 h


Sujet :

Développement SQL Server

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Juillet 2022
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Paramétreur de progiciels
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2022
    Messages : 7
    Points : 6
    Points
    6
    Par défaut Convertir des secondes en hh:mm:ss lorsque l'on dépasse 24 h
    Bonjour,

    En cherchant sur ce forum je suis tombé sur ce post mais malheureusement il ne m'indique pas la formule à priori lorsque le temps dépasse 24 h

    En SQL Server (je travaille sur SEI) quelle est la formule qui me permettrait de convertir 25.666 en 25:39:57 ?

    Cette formule n'est plus adapté car ça dépasse 24 h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    convert(varchar,DATEADD(s,  mon temps en secondes * 3600, '1900/01/01'),108)
    Merci à vous !!

    Bien cordialement

  2. #2
    Membre expérimenté Avatar de AaâÂäÄàAaâÂäÄàAaâÂäÄ
    Homme Profil pro
    db@
    Inscrit en
    Septembre 2021
    Messages
    533
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : db@

    Informations forums :
    Inscription : Septembre 2021
    Messages : 533
    Points : 1 563
    Points
    1 563
    Par défaut
    Vous avez l'information en heure et le moyen d'avoir les minutes / secondes.
    Avec un peu de manipulations de base, ça se fait.
    Qu'est-ce que vous avez essayer ?

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Juillet 2022
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Paramétreur de progiciels
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2022
    Messages : 7
    Points : 6
    Points
    6
    Par défaut Convertir des secondes en hh:mm:ss lorsque l'on dépasse 24 h
    Bonjour,

    Merci pour votre retour
    Non j'ai juste tenter ma formule indiquée dans mon post précédent
    cdlt

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 939
    Points : 51 774
    Points
    51 774
    Billets dans le blog
    6
    Par défaut
    Figurez vous que convertir une durée en date (ce que fait la fonction DATEADD comme son nom l'indique) ne permet pas de dépasser 23h59m60 s... Tout simplement par ce que les jours qui sont des dates n'ont pas de 25e heure !!!

    Ce que vous voulez faire n'est pas une date mais une durée. Ce n'est pas du tout la même chose et ce code n'est donc pas approprié !

    Si vous voulez une durée en heure décimale il suffit de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT MON_TEMPS_EN_SECONDE / 3600. AS DUREE_HEURE_DECIMALES
    Si vous voulez distinguer les heures, minutes secondes il faut faire un calcul à base de modulo et division... Une fonction scalaire est intéressant pour ce faire :

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    CREATE OR ALTER FUNCTION dbo.F_DURATION_SECONDS_IN_HMS (@DURATION_SECONDS INT)
    RETURNS VARCHAR(32)
    WITH RETURNS NULL ON NULL INPUT
    AS
    /******************************************************************************
    * MODULE  : GESTION DU TEMPS                                                  *
    * NATURE  : fonction scalaire                                                 *
    * OBJECT  : dbo.F_DURATION_SECONDS_IN_HMS                                     *
    * OUPUT   : chaine de caractères au format ...hhh:mm:ss                       *
    * CREATE  : 2024-11-14                                                        *
    * AUTHOR  : SQLpro - Fred Brouard - Sté SQL Spot - PARIS / PACA               *
    * VERSION : 1                                                                 *
    * VALID   : 2008 ..                                                           *
    *******************************************************************************
    * Frédéric BROUARD  -  alias SQLpro  -   SARL SQL SPOT  -  SQLpro@sqlspot.com *
    * Architecte de données :  expertise, audit, conseil, formation, modélisation *
    * tuning, sur les SGBD Relationnels, le langage SQL, MS SQL Server/PostGreSQL *
    * blog: http://blog.developpez.com/sqlpro  site: http://sqlpro.developpez.com *
    * expert technical blog : http://mssqlserver.fr - from book : SQL Server 2014 *
    *******************************************************************************
    * PURPOSE : renvoie une chaine de caractère de format  ....hhh:mm:ss          *
    *           à partir d'une duée exprimée en un nombre de secondes             *                                                  *
    *******************************************************************************
    * INPUTS  : @DURATION_SECONDS entier 32 bits signé                            *
    *******************************************************************************
    * EXAMPLE : SELECT dbo.F_DURATION_SECONDS_IN_HMS (123456)                     *
    *******************************************************************************
    * IMPROVE :                                                                   *
    *******************************************************************************
    * BUGFIX  :                                                                   *
    ******************************************************************************/
    BEGIN
       IF @DURATION_SECONDS < 0 
          RETURN NULL;
       DECLARE @RETVAL VARCHAR(32) = CAST(@DURATION_SECONDS / 3600 AS VARCHAR(32)) + ':';
       SET @DURATION_SECONDS = @DURATION_SECONDS % 3600;
       SET @RETVAL = @RETVAL +  FORMAT(@DURATION_SECONDS / 60, '00') + ':';
       SET @DURATION_SECONDS = @DURATION_SECONDS % 60;
       SET @RETVAL = @RETVAL +  FORMAT(@DURATION_SECONDS, '00') ;
       RETURN @RETVAL;
    END;
    GO
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    -- exemple :
    SELECT dbo.F_DURATION_SECONDS_IN_HMS (123456)
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Membre expérimenté
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    882
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 882
    Points : 1 696
    Points
    1 696
    Par défaut
    Et zut, je n'arrive pas à trouver l'équivalent de la fonction FORMAT disponible sous Excel.
    Nom : Capture d’écran 2024-11-15 084025.jpg
Affichages : 110
Taille : 62,8 Ko

    L'avantage est que ça reste une date (donc un numérique).

    j'ai tenté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    declare @start datetime = '20240101 8:00'
    	,@delay int = 20
    	,@end datetime
     
    select @end=dateadd(hour, 20, @start) 
    select @end, format(@end, '[h]:mm:ss')
    Quelqu'un sait comment traduire ce formatage en formulation DOTNET ?
    Le savoir est une nourriture qui exige des efforts.

  6. #6
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 174
    Points : 9 667
    Points
    9 667
    Par défaut
    Je répète ce que dit SQLPRO :
    Une date est une date, et une durée est une durée.
    Plus précisément, une DateHeure est une DateHeure, et une Durée est une Durée.
    Et ces 2 concepts (DateHeure versus Durée) sont différents.

    Quand la durée est inférieure à 24 heures, il se trouve que le format DateHeure ou Heure semble donner satisfaction... du coup, tu es tenté d'utiliser un format DateHeure ou Heure.
    Mais c'est un cadeau empoisonné.
    Dès que la durée dépasse 24h, le format Heure ne convient plus.

    Le format heure d'excel, ce n'est rien d'autre que la fin du format AAAA/MM/JJ HHh:MImn:SSs ; C'est une DateHeure affichée partiellement. Avec le format HHh:MImn:SSs, 44000.25 ou 44001.25 s'affichent de la même façon ; on ne veut voir que les heures, c'est à dire la partie décimale. 44000.25 ou 44001.25 donnent tous les deux 06h:00mn:00s en format heure, alors que dans un cas, on parle du 18 juillet 2020 à 6h00 du matin, et dans l'autre, on parle du 19 juillet 2020 à 6h00 du matin.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  7. #7
    Membre expérimenté
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    882
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 882
    Points : 1 696
    Points
    1 696
    Par défaut
    Citation Envoyé par tbc92 Voir le message
    Le format heure d'excel, ce n'est rien d'autre que la fin du format AAAA/MM/JJ HHh:MImn:SSs ; C'est une DateHeure affichée partiellement.
    reprenons : Excel ne reconnait, essentiellement, que 2 types : le numérique et le texte. Ce qui n'est pas du numérique est du texte.
    Une date n'est qu'un numérique affiché en tant que date.

    D'autre part le format AAAA/MM/JJ HHh:MImn:SSs n'est opérationnel ni dans Excel ni dans SQL.

    La réponse de SQLpro est de fabriquer une fonction dont le type résultant est varchar(32).
    La fonction format en fait de même https://learn.microsoft.com/fr-fr/sq...6#return-types
    Donc une fois formaté, la date n'est plus du type date, et ce, que le code soit fait par M$ ou par Frédéric.

    Vu que :
    • Il est possible de faire une procédure pour effectuer le formatage
    • La fonction SQL "format" existe et s'appuie sur les opérations DOTNET
    • Excel, effectue le formatage nativement

    Il ne me semble pas délirant de creuser le sujet.

    Citation Envoyé par tbc92 Voir le message
    Une date est une date, et une durée est une durée.
    oui.
    Et un varchar est un varchar.
    Si on veux afficher les unités (litres, mètres, grammes, ...) dans la colonne, celle si ne sera plus du numérique.

    Citation Envoyé par tbc92 Voir le message
    Une date est une date, et une durée est une durée.
    oui.
    Sauf que le type durée n'existe pas ; un loupé SQL server (à l'image du type bit qui n'existe pas dans Oracle) ?
    Le savoir est une nourriture qui exige des efforts.

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 939
    Points : 51 774
    Points
    51 774
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par Michel.Priori Voir le message
    ...
    Sauf que le type durée n'existe pas ; un loupé SQL server (à l'image du type bit qui n'existe pas dans Oracle) ?
    Le type "durée" n'existe pas dans le langage SQL. Le type INTERVAL oui, mais cela n'est pas la même chose. Un INTERVAL c'est en fait un un type DATETIME dont la précision permet de définir la granularité de temps que l'on souhaite. Par exemple, le type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INTERVAL HOUR TO MINUTE
    Permet de stocker des heures et minutes sans les secondes, ce que le type TIME ne permet pas (il y a obligatoirement les secondes)...

    Dans tous les cas une durée c'est une quantité de temps d'une granularité spécifique. Par exemple en entreprise on utilise souvent une durée en heures décimales dans les process et dans les RH on utilise souvent une quantité de jours travaillés en décimal aussi....

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  9. #9
    Membre expérimenté
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    882
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 882
    Points : 1 696
    Points
    1 696
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Le type "durée" n'existe pas dans le langage SQL. Le type INTERVAL oui
    Je n'ai pas trouvé de type INTERVAL dans le produit M$ SQL server.
    Je l'ai trouvé dans Databricks : https://learn.microsoft.com/fr-fr/az.../introduction/
    Or :
    Azure Databricks est une plateforme d’analyse ouverte unifiée permettant de générer, déployer, partager et gérer des données de niveau entreprise, des analyses et des solutions d’IA à grande échelle. La plateforme Databricks Data Intelligence s’intègre au stockage cloud et à la sécurité dans votre compte cloud, et gère et déploie l’infrastructure cloud en votre nom.
    Les requêtes fournies dans la page ne sont par opérationnelles sur une instance SQL 2022
    Le savoir est une nourriture qui exige des efforts.

  10. #10
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 939
    Points : 51 774
    Points
    51 774
    Billets dans le blog
    6
    Par défaut
    Effectivement le type INTERVAL n'existe pas dans SQL Server. C'est un héritage de SYBASE qui a l'époque à préférer utiliser un type DATETIME. La norme a d'ailleurs laissé le choix après coup d'utiliser soit le type INTERVAL, soit les types DATE, TIME, TIMESTAMP (avecv ou sans offset). Le problème est que le type INTERVAL est particulièrement épouvantable car il interdit tout intervalle de temps dont la précision intermédiaire est le mois, car l'arithmétique sur les mois ne peut pas fonctionner du fait que les mois ont des durées différentes...
    À me lire :
    https://sqlpro.developpez.com/livre/...t-null#LII-1-2

    Sauf que la plupart des SGBDR qui ont implémenté ce foutu merdier d'INTERVAL ont franchi la ligne rouge....

    SYBASE qui est arrivé un peu plus tard qu'Oracle et IBM, a dit "fuck the interval" et utilisé le DATETIME....
    Quand à PostGreSQL c'est une stupidité hérité d'Oracle, car PG voulait faire tout comme Oracle....

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

Discussions similaires

  1. Convertir des secondes en heure/min/sec
    Par DelphLaga dans le forum Langage
    Réponses: 8
    Dernier message: 26/02/2009, 20h29
  2. Convertir des secondes en HH:MM:SS
    Par Poisson59 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 29/08/2006, 11h32
  3. comment convertir des secondes en hh:mm:ss en xsl
    Par Jayceblaster dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 22/07/2005, 11h24
  4. [Fonction Oracle] Convertir des secondes en heure
    Par falcon dans le forum Oracle
    Réponses: 12
    Dernier message: 18/11/2004, 12h56
  5. [Fonction SQL Server] Convertir des secondes en heure
    Par falcon dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 17/11/2004, 18h22

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