Formatage des intervalles de temps dans Business Objects Desktop Intelligence (BO Deski)
-
08-07-2019 - |
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)?
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