2012-11-03 16 views
8

Używane są następujące polecenia do utworzenia w T-SQL liczby w formacie przecinek. Jak pozbyć się przecinka dziesiętnego i cyfr po przecinku. Więc jeśli dostanę 1,112.00 po formatowaniu, jak dostanę tylko 1,112?Formatować liczbę przecinkami, ale bez liczb dziesiętnych w SQL Server 2008 R2?

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

Jak zaznaczyć 2 odpowiedzi? Dodałem szczegółową odpowiedź i post Mitcha jest również odpowiedzią. – Sunil

+2

Z SQL Server 2012+ Możesz użyć funkcji FORMAT(). Jako drugi parametr użyjesz "#, ##". http://msdn.microsoft.com/en-us/library/hh213505.aspx – Volvox

+0

Możliwy duplikat [Jak sformatować liczbę przecinkami w T-SQL?] (https://stackoverflow.com/questions/4377352/how-do-i-format-a-number-with-commas-in-t-sql) –

Odpowiedz

17
DECLARE @val varchar(50) 

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

ta działa również z cyfr po przecinku:

DECLARE @val varchar(50) 

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

Uwaga: jak @Mahmoud Gamal zaznacza, formatowanie jest często bardziej nadaje się do wykonania w przód- koniec.

16

tak:

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

To zawsze działa poprawnie. Ponieważ CONVERT(VARCHAR(20), CAST(1112 AS MONEY), 1) zawsze zwróci liczbę z numerem .00. Jednak numer MitchWheat's answer jest lepszy w przypadku, gdy po przecinku występuje liczba dziesiętna.

Pamiętaj, że: Powinieneś rozważyć wykonanie tego formatowania w aplikacji z przodu. T-SQL nie dotyczy formatowania.

+0

Mahmoud - Dzięki za pomoc. Co jeśli mamy 1112.34, a następnie skrócenie .00 nie zadziała. Szukałem ogólnego rozwiązania. – Sunil

+0

@Sunil - Tak, masz rację. To nie zadziała w przypadku 1112.34. Ale zawsze działa dobrze w przypadku, o którym wspomniałeś w swoim pytaniu. Ponieważ 'CONVERT (VARCHAR (20), CAST (1112 JAK PIENIĄDZE), 1);' zawsze zwraca liczbę z '.00' Czy nie jest? W każdym przypadku odpowiedź @ MitchWheat jest lepsza niż ta i działa dobrze w tym przypadku. –

+0

+1 dla punktu dotyczącego formatowania w aplikacji z przodu. –

1

Po kilku badaniach znalazłem 2 możliwe odpowiedzi na moje pierwsze pytanie. Są one wymienione poniżej.

Opcja 1: Odpowiedź od Mitcha Wheata jest możliwą odpowiedzią. Jednakże, gdy chcemy sformatować wartość kolumny w obrębie SELECT, będziemy musieli utworzyć zdefiniowaną przez użytkownika funkcję skalarną za pomocą kodu T-SQL Mitcha i nazwać ten UDF naszym SQL.

-- ============================================= 
-- 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) 

Opcja 2: Możemy użyć funkcji systemu wbudowana o nazwie „parsename”, jak w kodzie T-SQL poniżej, aby sformatować i obciąć dziesiętne.

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

"Jednakże, gdy chcemy sformatować wartość kolumny w SELECT" - Niepoprawnie. Zrobiłem to w ten sposób, aby intencja była jasna. Mogłem po prostu łatwo to zrobić w linii. –

+0

Mitch - Masz rację. Jakoś przeoczyłem ten fakt. Mogłem właśnie użyć twojej logiki w linii prostej. Doceń swoją odpowiedź. – Sunil

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

To będzie działać dobrze.

Po automatycznym przeliczeniu typu danych na pieniądze zostaną dodane 2 zera po przecinku. Funkcja PARSENAME usunie te zera.

+0

jak to jest źle? – Govind

+0

Usunąłem mój komentarz. W przyszłości pomocne będzie używanie rzeczywistych nazw i wartości zmiennych OP, a także opis działania, zamiast publikowania bloku kodu. Ponieważ ich brakowało, okazało się, że kod ten nie ma związku z pytaniem, ale w tym założeniu byłam niepoprawna. –

+0

Dobra sugestia .. – Govind

Powiązane problemy