SQL SEC_TO_TIME()

Dans le langage SQL, la fonction SEC_TO_TIME() permet d’afficher des secondes dans un format : “HH:MM:SS” (heures, minutes et secondes). La fonction converti le nombre de seconde en nombre d’heures, de minutes et de secondes pour être plus compréhensible pour un humain.

La fonction est particulièrement utile pour afficher proprement la différence entre 2 timestamps. Elle est également utile pour ré-afficher au bon format des heures qui auraient été additionnées après avoir été converti en nombre de secondes à l’aide de la fonction TIME_TO_SEC().

Compatibilité : MySQL, Oracle et MariaDB.

Attention : le résultat est limité de -838:59:59 à 838:59:59 (3.020.399 secondes). Au delà, il faut trouver une autre solution, par exemple en retournant le résultat en secondes et en convertissant sous ce format avec un autre langage de programmation.

Syntaxe

La fonction s’utilise dans une requête SQL, en utilisant la syntaxe suivante :

SELECT SEC_TO_TIME( secondes );

Dans cette requête, le paramètre “secondes” correspond au nombre de secondes à convertir. Le résultat sera affiché au format “HH:MM:SS”. Si le résultat dépasse les 99 heures, le format peut être “HHH:MM:SS”.

Exemple

Exemples basiques

La fonction peut s’utiliser avec des nombres positifs ou négatifs. Lorsque la limite est dépassée, ce sera toujours le seuil de 838:59:59 qui sera affiché.

SELECT SEC_TO_TIME(1);          -- retourne : 00:00:01
SELECT SEC_TO_TIME(60);         -- retourne : 00:01:00
SELECT SEC_TO_TIME(3600);       -- retourne : 01:00:00
SELECT SEC_TO_TIME(86398);      -- retourne : 23:59:58
SELECT SEC_TO_TIME(86399);      -- retourne : 23:59:59
SELECT SEC_TO_TIME(86400);      -- retourne : 24:00:00
SELECT SEC_TO_TIME(86401);      -- retourne : 24:00:01
SELECT SEC_TO_TIME(3020398);    -- retourne : 838:59:58
SELECT SEC_TO_TIME(3020399);    -- retourne : 838:59:59
SELECT SEC_TO_TIME(3020400);    -- retourne : 838:59:59
SELECT SEC_TO_TIME(999999999);  -- retourne : 838:59:59

SELECT SEC_TO_TIME(0);          -- retourne : 00:00:00
SELECT SEC_TO_TIME(-60);        -- retourne : -00:01:00
SELECT SEC_TO_TIME(-3600);      -- retourne : -01:00:00
SELECT SEC_TO_TIME(-86400);     -- retourne : -24:00:00
SELECT SEC_TO_TIME(-3020398);   -- retourne : -838:59:58
SELECT SEC_TO_TIME(-3020399);   -- retourne : -838:59:59
SELECT SEC_TO_TIME(-3020400);   -- retourne : -838:59:59
SELECT SEC_TO_TIME(-999999999); -- retourne : -838:59:59

Différence de timestamp

Imaginons une table qui contient des articles. La table contient 2 colonnes avec des timestamps, l’un qui correspond au timestamp (date) de la création de l’article et l’autre le timestamp (date) de la publication de l’article.

Table “article” :

iddate_creationdate_publication
114099912521410158391
214102760871410277743
314103488061410350209
414104256691410445892

Il est possible de déterminer la différence entre la date de création et la date de publication en effectuant une soustraction. Ce résultat peut être formaté avec la fonction SEC_TO_TIME() en utilisant une requête similaire à celle-ci :

SELECT id, 
       date_creation, 
       date_publication, 
       ( date_publication - date_creation ) AS diff, 
       SEC_TO_TIME( date_publication - date_creation ) AS diff_hhmmss
FROM article

Résultat :

iddate_creationdate_publicationdiffdiff_hhmmss
11409991252141015839116713946:25:39
214102760871410277743165600:27:36
314103488061410350209140300:23:23
4141042566914104458922022305:37:03

Sommes de plusieurs heures

Imaginons une table “project” qui contient une liste de projet avec le temps passé pour chacun des projets.

Table “project” :

idprojecttemps
1projet umbrella00:43:31
2ABC project03:14:09
31001 projets147:46:41
4alpha-beta34:26:02

Pour obtenir la somme des heures passées pour chacun de ces projets et ainsi avoir une vision globale, il est possible d’utiliser la requête SQL suivante :

SELECT SEC_TO_TIME( SUM( TIME_TO_SEC(temps) ) )
FROM project

Résultat :

186:10:23

La requête permet d’obtenir un résultat total de 186 heures, 10 minutes et 23 secondes.

Attention, il ne faut pas oublier la limite de 838 heures, 59 minutes et 59 secondes. Au delà, les données risque d’être faussées.

Partager