2013-04-11 10 views
14

dostaję ten błądSQL Server: arytmetyczny błąd przepełnienia konwersji wyrażenie do danych typu int

msg 8115, Level 16, State 2, wiersz 18
błąd przepełnienie konwersji wyrażenie do danych typu int.

z tego zapytania SQL

DECLARE @year VARCHAR(4);      
DECLARE @month VARCHAR(2);      

-- START OF CONFIGURATION SECTION      
-- THIS IS THE ONLY SECTION THAT SHOULD BE MODIFIED      
-- SET THE YEAR AND MONTH PARAMETERS       

SET @year = '2013';      
SET @month = '3'; -- 1 = January.... 12 = Decemeber.      

-- END OF CONFIGURATION SECTION      

DECLARE @startDate DATE      
DECLARE @endDate DATE      
SET @startDate = @year + '-' + @month + '-01 00:00:00';      
SET @endDate = DATEADD(MONTH, 1, @startDate);      

SELECT       
    DATEPART(YEAR, dateTimeStamp) AS [Year]       
    , DATEPART(MONTH, dateTimeStamp) AS [Month]       
    , COUNT(*) AS NumStreams       
    , [platform] AS [Platform]      
    , deliverableName AS [Deliverable Name]      
    , SUM(billableDuration) AS NumSecondsDelivered      
FROM        
    DeliveryTransactions       
WHERE       
    dateTimeStamp >= @startDate      
AND dateTimeStamp < @endDate       
GROUP BY        
    DATEPART(YEAR, dateTimeStamp)      
    , DATEPART(MONTH, dateTimeStamp)       
    , [platform]       
    , deliverableName      
ORDER BY        
    [platform]      
    , DATEPART(YEAR, dateTimeStamp)       
    , DATEPART(MONTH, dateTimeStamp)       
    , deliverableName 
+1

I o co dokładnie pytasz? Błąd jest oczywisty: kończysz na numerze, który jest zbyt duży dla typu danych "int". –

+1

proszę wskazać, który numer jest zbyt duży dla typu danych? dzięki – user2270544

+0

W przypadku dat jako ciągów należy zawsze używać formatu ** ISO-8601 ** - "RRRRMMDD" - tylko ten format gwarantuje działanie ** dowolnego ** języka i/lub ustawień regionalnych –

Odpowiedz

33

jest problem z SUM(billableDuration)? Aby się tego dowiedzieć, spróbuj skomentować tę linię i sprawdź, czy działa.

Może to oznaczać, że suma przekracza maksymalną liczbę int. Jeśli tak, spróbuj zastąpić go SUM(CAST(billableDuration AS BIGINT)).

+0

co powinienem zrobić? – user2270544

1
SELECT       
    DATEPART(YEAR, dateTimeStamp) AS [Year]       
    , DATEPART(MONTH, dateTimeStamp) AS [Month]       
    , COUNT(*) AS NumStreams       
    , [platform] AS [Platform]      
    , deliverableName AS [Deliverable Name]      
    , SUM(billableDuration) AS NumSecondsDelivered 

Przyjmując, że cytowany tekst jest dokładnym tekstem, jedna z tych kolumn nie może wykonać obliczeń matematycznych, które chcesz. Kliknij dwukrotnie błąd i podświetli linię, która powoduje problemy (jeśli jest inna niż opublikowana, może nie być dostępna); Przetestowałem twój kod za pomocą zmiennych i nie było problemu, co oznacza, że ​​jeden z tych kolumn (o których nie wiemy więcej szczegółowych informacji) tworzy ten błąd.

Jeden z twoich wyrażeń musi być rzutowany/konwertowany na int, aby tak się stało, co jest znaczeniem Arithmetic overflow error converting expression to data type int.

1

Zmień SUM(billableDuration) AS NumSecondsDelivered do

sum(cast(billableDuration as bigint)) lub

sum(cast(billableDuration as numeric(12, 0))) w zależności od potrzeb.

Wynikowy typ wyrażenia Sum jest taki sam, jak używany typ danych. Zgłasza błąd w momencie przepełnienia. Zatem rzutowanie kolumny na typ danych o większej pojemności, a następnie użycie operacji Sum działa dobrze.

-1
declare @d real 
set @d=1.0; 
select @d*40000*(192+2)*20000+150000 
+5

Czy mógłbyś dodać jakieś wyjaśnienie do swojej odpowiedzi? – slfan

Powiązane problemy