Sql server sql中不同id的日期差之和

Sql server sql中不同id的日期差之和,sql-server,Sql Server,我有如下用户定义的函数: create FUNCTION dbo.FormattedTimeDiff (@Date1 DATETIME, @Date2 DATETIME) RETURNS VARCHAR(10) AS BEGIN DECLARE @DiffSeconds INT = sum(DATEDIFF(SECOND, @Date1, @Date2) ) DECLARE @DiffHours INT = @DiffSeconds / 3600 DECLARE @Di

我有如下用户定义的函数:

create FUNCTION dbo.FormattedTimeDiff (@Date1 DATETIME, @Date2 DATETIME)
RETURNS VARCHAR(10)
AS BEGIN
    DECLARE @DiffSeconds INT = sum(DATEDIFF(SECOND, @Date1, @Date2) )

    DECLARE @DiffHours INT = @DiffSeconds / 3600
    DECLARE @DiffMinutes INT = (@DiffSeconds - (@DiffHours * 3600)) / 60
    DECLARE @RemainderSeconds INT = @DiffSeconds % 60

    DECLARE @ReturnString VARCHAR(10)

    SET @ReturnString = RIGHT('00' + CAST(@DiffHours AS VARCHAR(2)), 2) + ':' +
                        RIGHT('00' + CAST(@DiffMinutes AS VARCHAR(2)), 2) + ':' +
                        RIGHT('00' + CAST(@RemainderSeconds AS VARCHAR(2)), 2)

    RETURN @ReturnString
END
SELECT 
    t.vtid,
    dbo.FormattedTimeDiff(PayDate, DelDate)
FROM    
    dbo.Transaction_tbl t  
    where t.Locid = 5   
vtid        
----------- ----------
7           00:21:42
7           01:05:30
7           00:37:43
7           NULL
8           00:00:42
8           00:07:25
7           00:25:36.
我试着这样做:

create FUNCTION dbo.FormattedTimeDiff (@Date1 DATETIME, @Date2 DATETIME)
RETURNS VARCHAR(10)
AS BEGIN
    DECLARE @DiffSeconds INT = sum(DATEDIFF(SECOND, @Date1, @Date2) )

    DECLARE @DiffHours INT = @DiffSeconds / 3600
    DECLARE @DiffMinutes INT = (@DiffSeconds - (@DiffHours * 3600)) / 60
    DECLARE @RemainderSeconds INT = @DiffSeconds % 60

    DECLARE @ReturnString VARCHAR(10)

    SET @ReturnString = RIGHT('00' + CAST(@DiffHours AS VARCHAR(2)), 2) + ':' +
                        RIGHT('00' + CAST(@DiffMinutes AS VARCHAR(2)), 2) + ':' +
                        RIGHT('00' + CAST(@RemainderSeconds AS VARCHAR(2)), 2)

    RETURN @ReturnString
END
SELECT 
    t.vtid,
    dbo.FormattedTimeDiff(PayDate, DelDate)
FROM    
    dbo.Transaction_tbl t  
    where t.Locid = 5   
vtid        
----------- ----------
7           00:21:42
7           01:05:30
7           00:37:43
7           NULL
8           00:00:42
8           00:07:25
7           00:25:36.
但我得到的输出是这样的:

create FUNCTION dbo.FormattedTimeDiff (@Date1 DATETIME, @Date2 DATETIME)
RETURNS VARCHAR(10)
AS BEGIN
    DECLARE @DiffSeconds INT = sum(DATEDIFF(SECOND, @Date1, @Date2) )

    DECLARE @DiffHours INT = @DiffSeconds / 3600
    DECLARE @DiffMinutes INT = (@DiffSeconds - (@DiffHours * 3600)) / 60
    DECLARE @RemainderSeconds INT = @DiffSeconds % 60

    DECLARE @ReturnString VARCHAR(10)

    SET @ReturnString = RIGHT('00' + CAST(@DiffHours AS VARCHAR(2)), 2) + ':' +
                        RIGHT('00' + CAST(@DiffMinutes AS VARCHAR(2)), 2) + ':' +
                        RIGHT('00' + CAST(@RemainderSeconds AS VARCHAR(2)), 2)

    RETURN @ReturnString
END
SELECT 
    t.vtid,
    dbo.FormattedTimeDiff(PayDate, DelDate)
FROM    
    dbo.Transaction_tbl t  
    where t.Locid = 5   
vtid        
----------- ----------
7           00:21:42
7           01:05:30
7           00:37:43
7           NULL
8           00:00:42
8           00:07:25
7           00:25:36.
我想得到VTID7和VTID8的日期差之和

预期产出:

vtid   
7        01:25:45
8         00:07:45 

我试图通过显示错误来给组赋值,所以我必须在存储过程中进行哪些更改?

在这种情况下,您需要更改“your”函数以使用秒作为输入参数,而不是两个日期:

CREATE FUNCTION [dbo].[FormattedTimeDiffFromSeconds] (@Seconds INT)
RETURNS VARCHAR(10)
AS BEGIN
    DECLARE @DiffHours INT = @Seconds / 3600
    DECLARE @DiffMinutes INT = (@Seconds - (@DiffHours * 3600)) / 60
    DECLARE @RemainderSeconds INT = @Seconds % 60

    DECLARE @ReturnString VARCHAR(10)

    SET @ReturnString = RIGHT('00' + CAST(@DiffHours AS VARCHAR(2)), 2) + ':' +
                        RIGHT('00' + CAST(@DiffMinutes AS VARCHAR(2)), 2) + ':' +
                        RIGHT('00' + CAST(@RemainderSeconds AS VARCHAR(2)), 2)

    RETURN @ReturnString
END
然后,您可以进行选择,以秒为单位汇总时差,并将其格式化:

SELECT
    v.Vtype, 
    SUM(DATEDIFF(MI, t.Paydate, t.DelDate)) as sum_min,
    dbo.FormattedTimeDiffFromSeconds(SUM(DATEDIFF(SECOND, t.Paydate, t.DelDate))),
    AVG(CONVERT(NUMERIC(18, 2), DATEDIFF(MI, t.Paydate, t.DelDate))) as avg_min
FROM
    dbo.Transaction_tbl t 
LEFT JOIN
    dbo.VType_tbl v ON t.vtid = v.vtid 
WHERE 
    t.transactID IN (24, 25) 
GROUP BY
    v.Vtype