Comment convertir en SQL le nombre de secondes en une durée lisible par l'homme?
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?
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
;