0

我在我的数据库中有这样的存储过程:

ALTER procedure [dbo].[performance]
(@startdate nvarchar(100), @enddate nvarchar(100)
as begin
    declare @date1 nvarchar(100) = convert(varchar, @startdate+' 00:00:00.000', 120)

    declare @date2 nvarchar(100) = convert(varchar, @enddate+' 23:59:59.000', 120)

    set NOCOUNT on;
    select l.LocName,v.Vtype, SUM(DATEDIFF(MI,t.Paydate,t.DelDate)) as TotalDiff,
    [dbo].[testfunction](
CONVERT(decimal(10,1), AVG( CONVERT(NUMERIC(18,2), DATEDIFF(SS,t.Paydate,t.DelDate) ) )))  as Average
    from Transaction_tbl t
    left join VType_tbl v
        on t.vtid=v.vtid
    left join Location_tbl l
        on t.Locid=l.Locid
    where t.Locid in
        (select t1.Locid from Transaction_tbl t1)
    and dtime between '' + @date1 +'' and ''+ @date2 +''
    and Status =5
    group by v.Vtype,l.LocName,l.Locid order by l.Locid
end

我的测试功能像这样:

ALTER FUNCTION [dbo].[testfunction] (@dec NUMERIC(18, 2)) RETURNS Varchar(50) 
AS
BEGIN
 DECLARE
 @hour integer,
      @Mns integer,
      @second decimal(18,3)

 DECLARE @Average  Varchar(50) 
 select @hour=CONVERT(int,@dec/60/60)
 SELECT @Mns = convert(int, (@dec / 60) - (@hour * 60 ));
 select @second=@dec % 60;

 SELECT @Average = 
        convert(varchar(9), convert(int, @hour)) + ':' +
    right('00' + convert(varchar(2), convert(int, @Mns)), 2) + ':' +
    right('00' + CONVERT(decimal(10,0), convert(varchar(6), @second)), 6)
 RETURN @Average     

END

如果我通过开始日期:2013-06-01 和结束日期:2013-08-01,那么如果我通过开始日期:2010-06-01 和结束日期:2013-08-01(更大的日期差异)然后得到错误:

将数字转换为数据类型 varchar 时出现算术溢出错误。

我知道我的功能有问题。但我无法找出我的功能有什么问题。如果有人请帮我找出

4

1 回答 1

0

试试这个..我认为你的@Mns 应该是问题所在

ALTER FUNCTION [dbo].[testfunction] (@dec NUMERIC(18, 2)) RETURNS Varchar(50) 
AS
BEGIN
 DECLARE
 @hour decimal(18,2),
      @Mns decimal(18,2),
      @second decimal(18,3)

 DECLARE @Average  Varchar(50) 
 select @hour=CONVERT(int,@dec/60/60)
 SELECT @Mns = convert(int, (@dec / 60) - (@hour * 60 ));
 select @second=@dec % 60;

 SELECT @Average = 
        convert(varchar(9), convert(int, @hour)) + ':' +
    right('00' + convert(varchar(8), convert(decimal(18,2), @Mns)), 2) + ':' +
    right('00' + CONVERT(decimal(10,0), convert(varchar(10), @second)), 6)
 RETURN @Average     

END
于 2013-08-27T10:54:11.697 回答