2008-08-06 14 views
7

Biorąc pod uwagę ograniczenie używania tylko T-Sql w Sql Server 2005, istnieje lepszy sposób na usunięcie punktu dziesiętnego z typu danych pieniędzy, niż konwersja do varchar (tutaj niejawnie), a następnie zastąpienie przecinka dziesiętnego?T-Sql Usunąć punkt dziesiętny z rodzaju danych pieniężnych

Oto, co mam obecnie.

SELECT REPLACE(1.23, '.', ''), REPLACE(19.99, '.', '') 

Która zwraca żądane 123 i 1999, ale zastanawiałem się, czy istnieje lepszy sposób. jakieś pomysły?

Odpowiedz

6

Pomnóż przez 100, a następnie przekonwertuj do int.

0

Czy mógłbyś bardziej szczegółowo opisać przypadek użycia? Usunięcie punktu dziesiętnego z reprezentacji jest trochę niezwykłe, ponieważ utracisz wszystkie informacje o skali. Zakładasz, że zawsze będą dwie cyfry? Jeśli tak, możesz uprościć pomnożenie przez 100, a następnie zaokrąglić przed konwersją na ciąg znaków.

0

Należy pamiętać, że typ danych pieniężnych może mieć maksymalnie 4 cyfry po przecinku. Wartości z więcej niż dwiema cyframi mogą nie działać zgodnie z oczekiwaniami dla oryginalnego rozwiązania lub sztuczki x100.

3

Nigdy nie należy używać danych typu money do przechowywania wartości pieniężnych. Jeśli wykonasz jakiekolwiek obliczenia, otrzymasz obcięte wyniki. Uruchom następujące zobaczyć, co mam na myśli

DECLARE 
@mon1 MONEY, 
@mon2 MONEY, 
@mon3 MONEY, 
@mon4 MONEY, 
@num1 DECIMAL(19,4), 
@num2 DECIMAL(19,4), 
@num3 DECIMAL(19,4), 
@num4 DECIMAL(19,4) 

SELECT 
@mon1 = 100, @mon2 = 339, @mon3 = 10000, 
@num1 = 100, @num2 = 339, @num3 = 10000 

SET @mon4 = @mon1/@mon2*@mon3 
SET @num4 = @num1/@num2*@num3 

SELECT @mon4 AS moneyresult, 
@num4 AS numericresult 

wyjściowa: 2949,0000 2949,8525

0

Oto Magic:

DataFormatString="{0:c0} 

To usunie miejsca po przecinku.

+1

Pierwotne ograniczenie polegało na tym, że mogło to być tylko w T-Sql. DataFormatString to rzecz .Net. – Pete