2017-05-04 28 views
0

如果我有兩列A和B,它們的數據類型爲nvarchar(50),其中兩個都使用貨幣代碼(例如100.00 USD)表示貨幣值,那麼如何才能我在觸發器或程序計算中只使用小數部分?SQL Server在計算中使用字符串的小數部分

例如,插入觸發器減去B的從A,值後,其中A = '300.00美元' 和B = '299.50美元':

... AS

聲明@a nvarchar(50);

declare @b nvarchar(50);

declare @ans decimal(10,2);

select @ a = i.A from inserted i;

select @ b = i.B from i插入;

BEGIN

現在我想找到@ans = @a - @b。

END

什麼複雜的是實際情況的那部分是做什麼的,用於值的範圍,在這裏我加入不同的表和輸出與「選擇測試的過程。進入「。

+1

爲什麼不將貨幣存儲在單獨的列中 –

+0

只是*不要*爲小數數據使用文本字段。問題是查詢,而不是SQL Server。你如何期望用*文本*進行數學運算?不要在涉及貨幣的地方執行操作。從*美元*減去*磅*有什麼意義? –

+0

這將是理想的。不幸的是,這是一個大學項目,必須遵守標準化。具體的表格是用於預訂的,我試圖計算總價格。第三種常規形式不允許非優先屬性依賴於另一個非優先屬性,如果我將貨幣存儲在單獨的列中,情況就是如此。 – Nazgul

回答

1

如果貨幣正好是三個字符,你可以砍掉最後4;

select cast(left(val, len(val) - 4) as decimal(10, 2)) 

或者,你可以使用第一空間:

select cast(left(val, charindex(' ', val)) as decimal(10, 2)) 

我要補充一點,存儲貨幣值的比較典型的方法是使用兩列,一個是「錢」或「十進制」和另一種貨幣代碼。我鼓勵將貨幣值存儲爲字符串的唯一時間是在不支持定點小數字段的數據庫中。

您可以使用right()獲取貨幣代碼。

+0

謝謝!我同意有單獨的專欄,但在我的情況下必須遵守3NF,並且貨幣代碼不會取決於表的PK。 – Nazgul

1

使用Convert & Replace功能下一代碼: -

declare @a nvarchar(50); 

declare @b nvarchar(50); 

declare @ans decimal(10,2); 

set @a = '300.00 USD' 
set @B = '299.50 USD' 

set @ans = convert(decimal(10,2),replace(@a,'USD','')) - 
      convert(decimal(10,2),replace(@b,'USD','')) 

select @ans 

結果: -

0.50 
+0

''1000美元'''500英鎊'。截斷可能允許語句執行,但結果將是錯誤的 –

+0

是的,我會使用貨幣換算,如其他地方所述。這只是一個非常簡單的例子。 – Nazgul

相關問題