2013-04-11 80 views
14

Tôi nhận được lỗi nàySQL Server: Arithmetic lỗi tràn bộ chuyển đổi biểu thức để kiểu dữ liệu int

msg 8115, cấp 16, bang 2, dòng 18
tràn Arithmetic lỗi khi chuyển đổi biểu thức để kiểu dữ liệu int.

với truy vấn SQL này

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

Và chính xác bạn đang hỏi gì? Lỗi là hiển nhiên: bạn kết thúc bằng một số quá lớn đối với kiểu dữ liệu 'int'. –

+1

vui lòng chỉ ra số nào quá lớn đối với loại dữ liệu? Cảm ơn – user2270544

+0

Đối với ngày tháng dưới dạng chuỗi, bạn nên luôn sử dụng định dạng ** ISO-8601 ** - 'YYYYMMDD' - chỉ định dạng này được đảm bảo hoạt động cho ** bất kỳ ngôn ngữ và/hoặc cài đặt vùng nào ** –

Trả lời

33

Là vấn đề với SUM(billableDuration)? Để tìm hiểu, hãy thử nhận xét ra dòng đó và xem nó có hoạt động hay không.

Có thể là tổng vượt quá số tối đa int. Nếu vậy, hãy thử thay thế bằng SUM(CAST(billableDuration AS BIGINT)).

+0

tôi nên làm gì? – 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 

Giả sử văn bản được trích dẫn là văn bản chính xác, một trong các cột này không thể thực hiện các phép tính toán mà bạn muốn. Nhấp đúp vào lỗi và nó sẽ làm nổi bật dòng gây ra sự cố (nếu nó khác với những gì được đăng, nó có thể không ở trên đó); Tôi đã thử nghiệm mã của bạn với các biến và không có vấn đề gì, có nghĩa là một trong các cột này (mà chúng tôi không biết thêm thông tin cụ thể về) đang tạo ra lỗi này.

Một trong các biểu thức của bạn cần phải được đúc/chuyển đổi thành một int để điều này đi qua, đó là ý nghĩa của Arithmetic overflow error converting expression to data type int.

1

Thay đổi SUM(billableDuration) AS NumSecondsDelivered để

sum(cast(billableDuration as bigint)) hoặc

sum(cast(billableDuration as numeric(12, 0))) theo nhu cầu của bạn.

Loại kết quả của biểu thức Tổng là giống như loại dữ liệu được sử dụng. Nó ném lỗi tại thời điểm tràn. Vì vậy, đúc cột để loại dữ liệu dung lượng lớn hơn và sau đó sử dụng hoạt động Sum hoạt động tốt.

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

bạn có thể vui lòng thêm một số giải thích cho câu trả lời của bạn không? – slfan

Các vấn đề liên quan