Comment convertir en SQL le nombre de secondes en une durée lisible par l'homme?

StackOverflow https://stackoverflow.com/questions/197096

  •  10-07-2019
  •  | 
  •  

Question

Dans une base de données SQL, je fais des sélections qui obtiennent une durée (à la suite d'une soustraction entre deux dates) en secondes sous la forme d'un entier. Mais je souhaite formater ce résultat sous une forme lisible par l'homme, telle que "hh: mm" ou "dd: hh". Est-ce possible en SQL et comment puis-je m'en rendre compte?

Était-ce utile?

La solution

Dans SQL 2005, vous pouvez utiliser les éléments suivants:

    select convert(varchar(8), dateadd(second, [SecondsColumn], 0),  108)

Ce qui convertit d’abord les secondes en une date après le 01-01-2010, puis obtient la partie hh: mm: ss.

Si la colonne contient plus de 24 heures, cette action est reportée. Si vous voulez des jours, puis des heures, procédez comme suit:

case when SecondsColumn> (24*60*60) 
        then 
            cast(datepart(day,datediff(dd, 0, dateadd(second, SecondsColumn, 0))) as varchar(4))
        +   'd' + convert(varchar(2), dateadd(second, SecondsColumn, 0), 108) 
    else
            convert(varchar(8), dateadd(second, SecondsColumn, 0), 108) 
    end

Autres conseils

Chaque base de données le fait différemment. J'utilise PostgreSQL et ça marche comme ça:

select to_char(my_date - my_other_date, 'HH:MM:SS');

Vous devrez consulter le manuel de la base de données que vous utilisez.

En supposant que vous ayez des secondes:

DECLARE @DurationSeconds INT

-- 25h 45m 14s
SET @DurationSeconds = (25 * 3600) + (45 * 60) + (14)

SELECT 
  @DurationSeconds, 
  @DurationSeconds / 3600 hours, 
  @DurationSeconds % 3600 / 60 minutes,
  @DurationSeconds % (3600 / 60) seconds

Je vais vous laisser la tâche de la mettre en forme. : -)

Il n'y a pas de standard, bien que de nombreux SGBD aient leur propre syntaxe personnalisée.

En général, il est préférable d'effectuer le travail de mise en forme pour la lisibilité humaine dans la couche de présentation de votre application plutôt que n'importe où près de la base de données.

Dans Oracle SQL:

   -- 86,400 seconds in a  day
   --  3,600 seconds in an hour
   --     60 seconds in a  minute
   select duration, -- seconds
    trunc((duration)/86400) || ':' || -- dd
    trunc(mod(duration,86400)/3600) || ':' || -- hh
    trunc(mod(mod(duration,86400),3600)/60) || ':' || -- mm
    mod(mod(mod(duration,86400),3600),60) -- ss
   as human_readable
   from dual
   ;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top