-1

SQL Server 2012 でピボット クエリを作成しました。正常に動作し、行の下にユーザー名の結果が表示され、列の下に秒単位で生産時間の合計が表示されます。しかし、秒を時間:分形式に分割する必要があります。クエリで私を助けてください。

declare @empid nvarchar(20), @fromdate date, @todate date, @cols nvarchar(max), @query  AS VARCHAR(MAX), @dt varchar(20), @dt1 varchar(20) 

set @empid = 'EC0100'
set @fromdate = '10/01/13'
set @todate = '10/31/13'
set @dt='Exceptions'
set @dt1='Tech Issues'

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(convert(nvarchar(20),c._Date, 101))
         FROM MIS_BM_Calendar c
         where c._Date between @fromdate and @todate and _Day not in
('Sunday')
         FOR XML PATH(''), TYPE
         ).value('.', 'NVARCHAR(MAX)')
     ,1,1,'')

set @query= 'select UserName, '+@cols+' from 
(select  e.UserName, c._Date , (SUM(DATEDIFF(SS,0,c.TimeTaken))) As TimeTaken
 from MIS_BM_Users e 
 inner join MIS_Opus c 
 on e.EmpId=c.EmpId 
 where (e.AccountManagerID='''+@empid+''') and c.Category not in ('''+@dt+''','''+@dt1+''')
 group by c._Date, e.UserName
) As SourceTable
Pivot
(
SUM(TimeTaken) for _Date in ('+@cols+')
) As Pvt'

execute(@query)
4

2 に答える 2

2

1 分と 1 時間の秒数は一定です。1分間に60秒、1時間に3600秒。ピボット クエリはこれに影響しません。

したがって、あなたの質問は、秒を時間、分、秒に変換する方法になります。あなたは 2012 年から、便利でダンディな TimeFromParts 関数を持っているので、時間、分、秒をフィードする必要があることがわかります。

WITH SRC (TimeTaken) AS
(
    SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
    FROM sys.all_columns AS AC
)
, Proof AS
(
    -- this logic is valid as long as TimeTaken is less than 24 hours
    -- or 86400 (24 * 60 * 60) seconds
    SELECT 
        SRC.TimeTaken
        -- integer division drops remainder
    ,   SRC.TimeTaken / 3600 AS Hours
        -- integer division and modulo operator to keep legit values
    ,   (SRC.TimeTaken / 60) % 60  AS Minutes
        -- modulo to have values 0 - 59
    ,   SRC.TimeTaken % 60 AS Seconds
    FROM
        SRC
)
SELECT
    P.TimeTaken
,   P.Hours
,   P.Minutes
,   P.Seconds
,   TIMEFROMPARTS(P.Hours, P.Minutes, P.Seconds, 0, 0) AS TimeTakenTimeType
FROM
    Proof AS P;

SQLフィドル

于 2013-11-03T04:52:14.097 に答える
1

スカラー関数を作成し、秒を HHMMSS に変換しました。次に、関数をメイン クエリに含めます。

ALTER function [dbo].[ConvertSecondsToHHMMSS]
(
@TotalSeconds int
)
Returns nvarchar(20)
As
Begin
declare @hours int, @minutes int, @seconds int, @result nvarchar(20)

set @hours = @TotalSeconds / 3600
set @minutes = (@TotalSeconds % 3600) / 60
set @seconds = @TotalSeconds % 60

set @result =  CONVERT(nvarchar(20),@hours) + ':' + CONVERT(nvarchar(20),@minutes) + ':' +CONVERT(nvarchar(20),@seconds)

return @result
end

主なクエリ:

set @query= 'select UserName, '+@cols+' from
(
select  e.UserName, c._Date, dbo.ConvertSecondsToHHMMSS(SUM(DATEDIFF(SS,0,c.TimeTaken))) As TimeTaken from MIS_BM_Users e 
inner join MIS_Opus c on e.EmpId=c.EmpId 
where (e.AccountManagerID='''+@AccountManagerId+''')
and c.Category not in ('''+@Condition1+''', '''+@condition2+''')
group by c._Date, e.UserName
) As SourceTable
Pivot
(
MIN(TimeTaken) for _Date in ('+@cols+')
) As Pvt'

execute(@query)
于 2013-11-04T05:55:25.220 に答える