Question

Quelqu'un peut-il me dire comment formater un nombre donné de secondes (par exemple, 16742 secondes) sous une forme lisible par l'homme (par exemple, 1d 5h 2m 13s)

  • utilisant une formule de champ BO
    ou
  • depuis une instruction SELECT T-SQL (où la durée en tant que secondes provient d'un agrégat SUM)?
Était-ce utile?

La solution

Je l'ai fait en utilisant Deski et quatre variables. Commencez par avec la mesure des heures, créez des variables. Dans la suite, ma variable année est vYears, ma variable Mois est vMonths, ma variable jours est vDays et ma variable heures est vHours.

vYears utilise le calcul suivant:

=Floor(Sum(<Hours Billed by Date Billed>/24)/365.25)

vWeeks utilise le calcul suivant:

=Floor(Sum((Sum(<Hours Billed by Date Billed>/24)/365.25)-<vYears>)*365.25/7)

vDays utilise le calcul suivant:

=Floor(Sum(Sum((Sum(<Hours Billed by Date Billed>/24)/365.25)-<vYears>)*365.25/7-<vWeeks>)*52/24)

vHours utilise le calcul suivant:

=Truncate(Sum((Sum(Sum((Sum(<Hours Billed by Date Billed>/24)/365)-<vYears>)*365/7-<vWeeks>)*52/24-<vDays>)*24) , 2)

I Puis, vous pouvez générer ces variables en procédant comme suit:

=<vYears>+" Years "+<vWeeks>+" Weeks "+<vDays>+" Days "+<vHours>+" Hours"

Si vous avez besoin d'informations supplémentaires, n'hésitez pas à demander.

Merci,

Matt

Autres conseils

Personnellement, je créerais une fonction SQL pour cela. Vous trouverez ci-dessous un exemple que vous pouvez adapter:

IF(OBJECT_ID('FN_STRING_TO_TIME', 'FN') IS NOT NULL)
    DROP FUNCTION FN_STRING_TO_TIME
GO

CREATE FUNCTION dbo.FN_STRING_TO_TIME( 

    -- Seconds to convert
    @pSeconds   INT
)
RETURNS VARCHAR(12)
---------------------------------------------------------------------------------------
-- Developer:       Linus Brimstedt
-- Date:        2009-03-17
--
-- Function:        Returns the given seconds in H:MM:SS format
--          
-- Output:          String in format H:MM:SS
--          
---------------------------------------------------------------------------------------
BEGIN

-----------------------------
-- Variables
-----------------------------

    DECLARE @output     VARCHAR(30) -- Describe the variables

    DECLARE @minutes    INT
    DECLARE @hours      INT

-----------------------------
-- Implementation
-----------------------------

    SET @minutes = @pSeconds / 60
    SET @pSeconds = @pSeconds % 60

    SET @hours = @minutes / 60
    SET @minutes = @minutes % 60

-----------------------------
-- Return output
-----------------------------
    RETURN  CAST(@hours AS VARCHAR) + ':'
    +   dbo.FN_STRING_LPAD(@minutes, 2, '0') + ':'
    +   dbo.FN_STRING_LPAD(@pSeconds, 2, '0') 
END
GO

-- Test
DECLARE @seconds    INT
,   @got        VARCHAR(12)
,   @expected   VARCHAR(12)

SELECT  @seconds = 67
,   @expected = '0:01:07'
SET @got = dbo.FN_STRING_TO_TIME(@seconds)

IF(@got != @expected)
    RAISERROR('FN_STRING_TO_TIME(%d) returned bad value: Expected: %s, got %s', 11, 11, @seconds, @expected, @got)

SELECT  @seconds = 60 * 60 * 7 + 60 * 14 + 34
,   @expected = '7:14:34'
SET @got = dbo.FN_STRING_TO_TIME(@seconds)

IF(@got != @expected)
    RAISERROR('FN_STRING_TO_TIME(%d) returned bad value: Expected: %s, got %s', 11, 11, @seconds, @expected, @got)

A bientôt / L

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top