2009-11-09 43 views
8

Tôi có cột Tiền trong bảng SQL Server 2008 của mình. Trong truy vấn dưới đây của tôi làm thế nào tôi có thể khỏa lấp nó để gần 5 $Vòng 5 gần nhất trong SQL Server

select FineAmount from tickets 

Cảm ơn

+1

Bạn có thể xác định "gần nhất" không? Tức là, bạn muốn kết quả nào cho các giá trị 0, 1, 2.5 và 4? Làm tròn tiền có thể có nghĩa là những thứ khác nhau tùy thuộc vào trường hợp sử dụng. – richardtallent

Trả lời

17
select round(FineAmount*2,-1)/2 from tickets 

hoặc đặt nicholaides gợi ý trong sql

select round(FineAmount/5,0)*5 from tickets 

Ví dụ giả định rằng FineAmount là loại tiền. Cách tiếp cận thứ hai là có lẽ tốt hơn là người đầu tiên làm việc với giới hạn của maximum_value_of_money_type/2

Thông tin thêm về ROUND

+0

Ghi chú duy nhất tôi muốn thêm vào này là đảm bảo rằng nó chia số 5 làm số thập phân, chứ không phải số nguyên. bạn có thể quấn nó trong một chuyển đổi/diễn viên, hoặc thêm một 0 vào nó, để đảm bảo nó hoạt động chính xác. ví dụ: chọn vòng (FineAmount/5.0,0) * 5 từ vé – Sam

11

Một giải pháp toán học tổng quát:

Divide 5, tròn đến số nguyên gần nhất, sau đó nhân với 5.

-8

Sử dụng chức năng ROUND

SELECT ROUND(FineAmount,5) 
    FROM tickets 
+1

Giá trị số nguyên trong quá tải 'ROUND' là biểu thị độ chính xác thập phân, không phải là bội số của vòng. – paqogomez

0
DECLARE @Amount DECIMAL(18,3) ; SET @Amount = 7818.32 

SELECT(Round((@Amount-CAST(@Amount AS INT))*100 /5,0)*5 /100) 
     + CAST(@Amount AS INT) 

- bạn sẽ nhận được 7818,30

2

Nếu bạn muốn cắt ngắn (tròn xuống) thành một nhóm 5 sử dụng hàm modulo; trong Microsoft SQL Server này là %

ví dụ: field1 - (field1% 5)

Nếu bạn có field1 == 3, sau đó calc sẽ là:

3 - (3% 5) = 0

thể nó là 13:

13 - (13% 5) = 10

Chỉ cần thêm 5 nếu bạn muốn tròn

Xem thêm 'MOD' is not a recognized built-in function name

+0

Lưu ý rằng "phao kiểu dữ liệu Operand không hợp lệ đối với toán tử modulo" –

+0

Nhưng 10 làm tròn lên là 10- (10% 5) +5 = 15 nhưng phải là 10. – Marichyasana

0

giải pháp đầu tiên của tôi là

create function dbo.udf_RoundToNearest(@x int, @to int) 
returns int 
with schemabinding as begin 
return @to * convert(int, round(convert(float, @x)/convert(float, @to), 0)) 
end 

này hoạt động, nhưng được coi bởi MSSQL là 'không chính xác' vì nó sử dụng số dấu chấm động trong nội bộ. Điều đó dừng nó được sử dụng trong các khung nhìn được lập chỉ mục. Thay vào đó, bạn chỉ có thể thực hiện công việc với số học số nguyên:

create function dbo.udf_RoundToNearest(@x int, @to int) 
returns int 
with schemabinding as begin 

declare @m int 
set @m = abs(@x) % abs(@to) 

declare @trunc int 
set @trunc = abs(@x) - @m 

declare @r int 
set @r = case when @m * 2 >= abs(@to) then @trunc + abs(@to) else @trunc end 

return case when @x < 0 then [email protected] else @r end 

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