web-dev-qa-db-fra.com

SQL Server: erreur de dépassement arithmétique lors de la conversion de l'expression en type de données int

Je reçois cette erreur 

msg 8115, niveau 16, état 2, ligne 18
Erreur de débordement arithmétique lors de la conversion de l'expression en type de données int.

avec cette requête 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   
29
user2270544

Le problème avec SUM(billableDuration)? Pour le savoir, essayez de commenter cette ligne et voyez si cela fonctionne. 

Il se peut que la somme dépasse le maximum int. Si tel est le cas, essayez de le remplacer par SUM(CAST(billableDuration AS BIGINT)).

57
Jeff Johnston

Remplacez SUM(billableDuration) AS NumSecondsDelivered par

sum(cast(billableDuration as bigint)) ou 

sum(cast(billableDuration as numeric(12, 0))) en fonction de vos besoins.

Le type résultant de l'expression Sum est identique au type de données utilisé. Il jette une erreur au moment du débordement. Il est donc judicieux de convertir la colonne en type de données de plus grande capacité, puis d’utiliser l’opération Sum. 

4
Faiyaz
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

En supposant que votre texte cité soit le texte exact, l'une de ces colonnes ne peut pas effectuer les calculs mathématiques souhaités. Double-cliquez sur l'erreur pour mettre en évidence la ligne à l'origine du problème (si elle est différente de celle affichée, il se peut que ce ne soit pas là-haut); J'ai testé votre code avec les variables et il n'y avait pas de problème, ce qui signifie qu'une de ces colonnes (sur laquelle nous ne connaissons pas d'informations plus spécifiques) crée cette erreur.

Une de vos expressions doit être convertie/convertie en un int pour que cela passe, ce qui est la signification de Arithmetic overflow error converting expression to data type int.

1
Question3CPO

De mon côté, cette erreur provient du type de données "INT 'dans la colonne Null values ​​. L'erreur est résolue en modifiant simplement le type de données varchar.

0
John Tecle