2012-11-03 81 views
8

Tôi đang sử dụng các bước sau để tạo số được định dạng bằng dấu phẩy trong T-SQL. Làm thế nào tôi có thể loại bỏ dấu thập phân và các chữ số sau dấu thập phân. Vì vậy, nếu tôi nhận được 1.112.00 sau khi định dạng, tôi sẽ chỉ nhận được 1.112 như thế nào?Định dạng một số bằng dấu phẩy nhưng không có số thập phân trong SQL Server 2008 R2?

SELECT CONVERT(varchar, CAST(1112 AS money), 1) 
+0

Làm cách nào để đánh dấu 2 câu trả lời? Tôi đã thêm một câu trả lời chi tiết cộng với bài viết của Mitch cũng là một câu trả lời. – Sunil

+2

Với SQL Server 2012+ Bạn có thể sử dụng hàm FORMAT(). Bạn sẽ sử dụng '#, ##' làm thông số thứ hai của mình. http://msdn.microsoft.com/en-us/library/hh213505.aspx – Volvox

+0

Bản sao có thể có của [Làm cách nào để định dạng một số bằng dấu phẩy trong T-SQL?] (https://stackoverflow.com/questions/4377352/how-do-i-format-a-number-với-dấu phẩy-in-t-sql) –

Trả lời

17
DECLARE @val varchar(50) 

set @val = CONVERT(varchar(50), CAST(1112 AS money), 1) 
SELECT left(@val, len(@val) - 3) 

này cũng làm việc với các chữ số sau dấu thập phân:

DECLARE @val varchar(50) 

set @val = CONVERT(varchar(50), CAST(1112.56 AS money), 1) 
SELECT left(@val, len(@val) - 3) 

Note: như @Mahmoud Gamal chỉ ra, định dạng là thường phù hợp hơn sẽ được thực hiện trong front- kết thúc.

16

Giống như vậy:

SELECT REPLACE(CONVERT(VARCHAR(20), CAST(1112 AS MONEY), 1), '.00', ''); 

này sẽ luôn hoạt động tốt. Vì CONVERT(VARCHAR(20), CAST(1112 AS MONEY), 1) sẽ luôn trả về một số với .00. Tuy nhiên, MitchWheat's answer tốt hơn trong trường hợp có số có số thập phân sau dấu phẩy.

Lưu ý rằng: Bạn nên cân nhắc thực hiện công cụ định dạng này trong ứng dụng giao diện người dùng. T-SQL không phải là về định dạng.

+0

Mahmoud - Cảm ơn sự giúp đỡ của bạn. Nếu chúng ta có 1112.34 thì cắt ngắn .00 sẽ không hoạt động. Tôi đang tìm một giải pháp chung. – Sunil

+0

@Sunil - Vâng, bạn nói đúng. Điều này sẽ không hoạt động trong trường hợp 1112.34. Nhưng nó luôn luôn hoạt động tốt trong trường hợp bạn đã đề cập trong câu hỏi của bạn. Bởi vì 'CONVERT (VARCHAR (20), CAST (1112 AS MONEY), 1);' luôn trả về một số với '.00' phải không? Bất kỳ cách nào câu trả lời của @ MitchWheat là tốt hơn so với điều này và nó hoạt động tốt cho trường hợp này. –

+0

+1 cho điểm liên quan đến định dạng trong ứng dụng giao diện người dùng. –

1

Sau một số nghiên cứu, tôi đã tìm thấy 2 câu trả lời có thể cho câu hỏi ban đầu của mình. Chúng được liệt kê dưới đây.

Tùy chọn 1: Câu trả lời từ Mitch Wheat là câu trả lời có thể xảy ra. Tuy nhiên, khi muốn định dạng một giá trị cột trong một SELECT, thì chúng ta sẽ phải tạo một hàm vô hướng do người dùng định nghĩa bằng cách sử dụng mã T-SQL của Mitch và gọi UDF này từ SQL của chúng ta.

-- ============================================= 
-- Description: Formats a number and truncates 
--    the decimal part. You can pass 
--    a number as a string or a numeric type. 
-- ============================================= 
CREATE FUNCTION dbo.Utility_fn_FormatNumberAndTruncateDecimals 
(
    @unFormattedNumber VARCHAR(100) 
) 
RETURNS VARCHAR(100) 
    AS 
BEGIN 
    DECLARE @val VARCHAR(100) 
    SET @val = convert(VARCHAR(50), cast(@unFormattedNumber AS MONEY), 1) 

    RETURN (SELECT left(@val, len(@val) - 3)) 
END 
GO 

--call this function using either of the SELECTS below 
SELECT dbo.Utility_fn_FormatNumberAndTruncateDecimals('233444') 
SELECT dbo.Utility_fn_FormatNumberAndTruncateDecimals(233444.345) 

Phương án 2: Chúng ta có thể sử dụng một chức năng hệ thống sẵn có gọi là 'parsename' như trong mã T-SQL dưới đây, để định dạng và cắt số thập phân.

SELECT PARSENAME(CONVERT(VARCHAR, CAST('2334442221.345222' AS MONEY), 1),2) 
+0

"Tuy nhiên, khi một người muốn định dạng giá trị cột trong một SELECT" - Không chính xác. Tôi đã làm theo cách đó để ý định rõ ràng. Tôi có thể dễ dàng thực hiện nội tuyến. –

+0

Mitch - Bạn nói đúng. Bằng cách nào đó tôi đã bỏ qua sự thật đó. Tôi có thể đã sử dụng nội tuyến logic của bạn. Đánh giá cao câu trả lời của bạn. – Sunil

9
PARSENAME(CONVERT(VARCHAR,CAST(1112 AS MONEY),1),2) 

Nó sẽ làm việc độc đáo.

Khi chuyển đổi số thành kiểu dữ liệu tiền tự động 2 số không sẽ được thêm sau số thập phân. Hàm PARSENAME sẽ xóa các số 0 đó.

+0

nó sai như thế nào? – Govind

+0

Tôi đã xóa nhận xét của mình. Trong tương lai, việc sử dụng các tên và/hoặc các giá trị biến thực tế của OP và cũng bao gồm một mô tả về những gì đang xảy ra thay vì chỉ đăng một khối mã. Vì những điều này bị thiếu, nó xuất hiện rằng mã này không liên quan đến câu hỏi nhưng tôi đã sai trong giả định đó. –

+0

Đề xuất tốt .. – Govind

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