Tsql 在Business Objects Desktop Intelligence(BO Deski)中格式化时间跨度
有谁能告诉我如何将给定的秒数(例如16742秒)格式化为人类可读的格式(例如1d 5h 2m 13s)Tsql 在Business Objects Desktop Intelligence(BO Deski)中格式化时间跨度,tsql,reporting,business-objects,timespan,Tsql,Reporting,Business Objects,Timespan,有谁能告诉我如何将给定的秒数(例如16742秒)格式化为人类可读的格式(例如1d 5h 2m 13s) 使用BO字段公式 或 在T-SQL SELECT语句中(其中持续时间(秒)来自总和聚合) 我个人会为此制作一个TSQL函数。以下是您可以调整的示例: IF(OBJECT_ID('FN_STRING_TO_TIME', 'FN') IS NOT NULL) DROP FUNCTION FN_STRING_TO_TIME GO CREATE FUNCTION dbo.FN_STRING
- 使用BO字段公式
或 - 在T-SQL SELECT语句中(其中持续时间(秒)来自总和聚合)
- 我个人会为此制作一个TSQL函数。以下是您可以调整的示例:
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)
干杯
/L我已经用Deski和四个变量完成了。 从小时度量开始,创建一些变量,在下面的my year变量是vYears,my Month变量是vMonths,my days变量是vDays,my hours变量是vHours vYears使用以下计算:
=Floor(Sum(<Hours Billed by Date Billed>/24)/365.25)
=楼层(总和(/24)/365.25)
vWeeks使用以下计算:
=Floor(Sum((Sum(<Hours Billed by Date Billed>/24)/365.25)-<vYears>)*365.25/7)
=Floor(Sum(Sum((Sum(<Hours Billed by Date Billed>/24)/365.25)-<vYears>)*365.25/7-<vWeeks>)*52/24)
=Truncate(Sum((Sum(Sum((Sum(<Hours Billed by Date Billed>/24)/365)-<vYears>)*365/7-<vWeeks>)*52/24-<vDays>)*24) , 2)
=楼层(总和((总和(/24)/365.25)-)*365.25/7
vDays使用以下计算:
=Floor(Sum((Sum(<Hours Billed by Date Billed>/24)/365.25)-<vYears>)*365.25/7)
=Floor(Sum(Sum((Sum(<Hours Billed by Date Billed>/24)/365.25)-<vYears>)*365.25/7-<vWeeks>)*52/24)
=Truncate(Sum((Sum(Sum((Sum(<Hours Billed by Date Billed>/24)/365)-<vYears>)*365/7-<vWeeks>)*52/24-<vDays>)*24) , 2)
=楼层(Sum(Sum((Sum(/24)/365.25)-)*365.25/7-*52/24)
vHours使用以下计算:
=Floor(Sum((Sum(<Hours Billed by Date Billed>/24)/365.25)-<vYears>)*365.25/7)
=Floor(Sum(Sum((Sum(<Hours Billed by Date Billed>/24)/365.25)-<vYears>)*365.25/7-<vWeeks>)*52/24)
=Truncate(Sum((Sum(Sum((Sum(<Hours Billed by Date Billed>/24)/365)-<vYears>)*365/7-<vWeeks>)*52/24-<vDays>)*24) , 2)
=截断(Sum((Sum((Sum(/24)/365)-)*365/7-*52/24-*24),2)
然后,我可以通过执行以下操作输出这些变量:
=<vYears>+" Years "+<vWeeks>+" Weeks "+<vDays>+" Days "+<vHours>+" Hours"
=+“年”+“周”+“天”+“小时”
如果您需要进一步的信息,请不要犹豫询问
谢谢
Matt谢谢,但不幸的是,这不能在BO Deski的SELECT语句中内联使用。要是这么简单就好了!好的,我从来没有用过生化需氧量。是不是有点像BO Crystal Reports?在CR中,做类似的事情相当简单。。。在BOD中使用它有什么问题,它不允许自定义查询?