2013-08-05 5 views
2
ALTER procedure [dbo].[performance] 
    @startdate nvarchar(100), 
    @enddate nvarchar(100) 
as begin 
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 '' + @startdate +'' and ''[email protected]+'' 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 @[email protected] % 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-01-01 и 2013-05-01 во время выполнения этой ошибки получения: ошибка арифметического переполнения, преобразующая числовые данные в тип данных varchar.

ответ

0

Попробуйте один -

ALTER PROCEDURE [dbo].[performance] 

    @startdate NVARCHAR(100), --<-- try to use date datatype - DATE, DATETIME, ... 
    @enddate NVARCHAR(100) 

AS 
BEGIN 
    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 dbo.Transaction_tbl t 
    LEFT JOIN dbo.VType_tbl v ON t.vtid = v.vtid 
    LEFT JOIN dbo.Location_tbl l ON t.Locid = l.Locid 
    WHERE dtime BETWEEN 
        CAST(@startdate AS DATETIME) 
       AND 
        CAST(@enddate AS DATETIME) --<-- possible problem 
     AND [status] = 5 
     --AND t.Locid IN (SELECT t1.Locid FROM Transaction_tbl t1) --<-- unnessesary 
    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 BIGINT 
     , @Mns BIGINT 
     , @second DECIMAL(18,3) 

    SELECT 
      @hour = CONVERT(BIGINT, @dec/60/60) 
     , @Mns = CONVERT(BIGINT, (@dec/60) - (@hour * 60)) 
     , @second = @dec % 60 

    RETURN 
     CONVERT(VARCHAR(50), CONVERT(BIGINT, @hour)) + ':' + --<-- VARCHAR(9) => VARCHAR(50) 
     RIGHT('00' + CONVERT(VARCHAR(2), CONVERT(BIGINT, @Mns)), 2) + ':' + 
     RIGHT('00' + CONVERT(DECIMAL(2, 0), CONVERT(VARCHAR(6), @second)), 6)  

END 
+0

сэр это работает, если я даю небольшой daterange..if я даю большой дате diifernce (я имею в виду STARTDATE = «2013 -01-21 'и enddate =' 2013-08-01 '), на этот раз получив ту же самую ошибку – user2648161

+0

Попробуйте это - 'EXEC [dbo]. [Performance] @startdate =' 20130121 ', @enddate =' 20130801'' – Devart

+0

while выполнение этой же ошибки при получении – user2648161

Смежные вопросы

 Смежные вопросы