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 :
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 :
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 |
1 2
| -- exemple :
SELECT dbo.F_DURATION_SECONDS_IN_HMS (123456) |
A +
Partager