2013-04-11 10 views
14

sto ricevendo questo erroreSQL Server: aritmetico errore di overflow conversione espressione tipo di dati int

msg 8115, livello 16, stato 2, riga 18
Errore di overflow aritmetico conversione espressione tipo di dati int.

con questa query 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

E cosa stai chiedendo esattamente? L'errore è ovvio: si finisce con un numero troppo grande per il tipo di dati 'int'. –

+1

Si prega di indicare quale numero è troppo grande per il tipo di dati? grazie – user2270544

+0

Per le date come stringa, devi sempre utilizzare il formato ** ISO-8601 ** - 'AAAAMMGG' - solo questo formato è garantito per ** qualsiasi ** lingua e/o impostazioni internazionali –

risposta

33

è il problema con SUM(billableDuration)? Per scoprirlo, prova a commentare quella linea e vedere se funziona.

Potrebbe essere che la somma superi il massimo int. Se è così, prova a sostituirlo con SUM(CAST(billableDuration AS BIGINT)).

+0

cosa devo fare? – 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 

Supponendo che il testo citato sia il testo esatto, una di queste colonne non può eseguire i calcoli matematici che si desidera. Fai doppio clic sull'errore e verrà evidenziata la linea che causa i problemi (se è diversa da quella che viene pubblicata, potrebbe non essere lassù); Ho testato il tuo codice con le variabili e non ci sono stati problemi, il che significa che una di queste colonne (di cui non conosciamo informazioni più specifiche) sta creando questo errore.

Una delle espressioni deve essere convertita/convertita in un int in modo che questo possa passare, che è il significato di Arithmetic overflow error converting expression to data type int.

1

Change SUM(billableDuration) AS NumSecondsDelivered a

sum(cast(billableDuration as bigint)) o

sum(cast(billableDuration as numeric(12, 0))) base alle vostre necessità.

Il tipo risultante di espressione Sum è uguale al tipo di dati utilizzato. Genera errore al momento dell'overflow. Quindi, il cast della colonna per il tipo di dati di capacità più grande e quindi l'utilizzo dell'operazione Sum funziona correttamente.

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

potresti per favore aggiungere qualche spiegazione alla tua risposta? – slfan

Problemi correlati