SQL Server: rekenkundige overloopfout bij het converteren van expressie naar gegevenstype int

Ik krijg deze foutmelding

bericht 8115, niveau 16, staat 2, regel 18
Rekenkundige overloopfout bij het converteren van expressie naar gegevenstype int.

met deze SQL-query

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   

Antwoord 1, autoriteit 100%

Is het probleem met SUM(billableDuration)? Om erachter te komen, probeer die regel te becommentariëren en kijk of het werkt.

Het kan zijn dat de som het maximum intoverschrijdt. Als dat zo is, probeer het dan te vervangen door sum(cast(billableDuration as bigint)).


Antwoord 2, autoriteit 14%

Verander SUM(billableDuration) AS NumSecondsDeliveredin

sum(cast(billableDuration as bigint))
of

sum(cast(billableDuration as numeric(12, 0)))volgens uw behoefte.

Het resulterende type Sum-expressie is hetzelfde als het gebruikte gegevenstype. Het gooit fout op het moment van overloop. Dus het casten van de kolom naar het gegevenstype met een grotere capaciteit en het vervolgens gebruiken van de Sum-bewerking werkt prima.


Antwoord 3, autoriteit 7%

Heel eenvoudig:

Use COUNT_BIG(*) AS NumStreams

Antwoord 4

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

Ervan uitgaande dat uw geciteerde tekst de exacte tekst is, kan een van deze kolommen de wiskundige berekeningen die u wilt niet doen. Dubbelklik op de fout en het zal de lijn markeren die de problemen veroorzaakt (als het anders is dan wat is gepost, is het misschien niet aanwezig); Ik heb je code getest met de variabelen en er was geen probleem, wat betekent dat een van deze kolommen (waar we niet meer specifieke informatie over weten) deze fout te maken.

Een van uw uitdrukkingen moet worden gegoten / geconverteerd naar een INT om doorheen te gaan, wat de betekenis is van Arithmetic overflow error converting expression to data type int.


Antwoord 5

Aan mijn zijde kwam deze fout uit het gegevenstype “INT” in de NULL-waardenkolom.
De fout is opgelost door alleen de gegevens te wijzigen A TYPE TO VARCHAR.


Antwoord 6

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

Other episodes