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
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
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
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
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.
Sử dụng chức năng ROUND
SELECT ROUND(FineAmount,5)
FROM tickets
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
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
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
Lưu ý rằng "phao kiểu dữ liệu Operand không hợp lệ đối với toán tử modulo" –
Nhưng 10 làm tròn lên là 10- (10% 5) +5 = 15 nhưng phải là 10. – Marichyasana
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
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