sql-server-2008 - server日期轉字串 - sql varchar轉int
如何在SQL Server中將float轉換為varchar (9)
我有一個不同長度的數字的浮動列,我試圖將它們轉換為varchar。
有些值超過了bigint max的大小,所以我不能做這樣的事情
cast(cast(float_field as bigint) as varchar(100))
我試過使用十進制,但數字的大小不一樣,所以這也沒有幫助
CONVERT(varchar(100), Cast(float_field as decimal(38, 0)))
任何幫助表示讚賞。
更新:
樣本值是2.2000012095022E + 26 。
float只有一個最大值。 精度為15位。 因此,第15位後的數字是隨機的,並且轉換為bigint(最多19位數字)或小數點不會對您有所幫助。
修改Axel的響應有點像某些情況下會產生不良結果。
DECLARE @MyFloat [float];
SET @MyFloat = 1000109360.050;
SELECT REPLACE(RTRIM(REPLACE(REPLACE(RTRIM((REPLACE(CAST(CAST(@MyFloat AS DECIMAL(38,18)) AS VARCHAR(max)), '0', ' '))), ' ', '0'),'.',' ')),' ','.')
嘗試這一個,應該工作:
cast((convert(bigint,b.tax_id)) as varchar(20))
如果您使用CLR函數,則可以將float轉換為看起來就像float一樣的字符串,而不會在末尾添加所有額外的0。
CLR功能
[Microsoft.SqlServer.Server.SqlFunction(DataAccess = DataAccessKind.Read)]
[return: SqlFacet(MaxSize = 50)]
public static SqlString float_to_str(double Value, int TruncAfter)
{
string rtn1 = Value.ToString("R");
string rtn2 = Value.ToString("0." + new string('0', TruncAfter));
if (rtn1.Length < rtn2.Length) { return rtn1; } else { return rtn2; }
}
。
例
create table #temp (value float)
insert into #temp values (0.73), (0), (0.63921), (-0.70945), (0.28), (0.72000002861023), (3.7), (-0.01), (0.86), (0.55489), (0.439999997615814)
select value,
dbo.float_to_str(value, 18) as converted,
case when value = cast(dbo.float_to_str(value, 18) as float) then 1 else 0 end as same
from #temp
drop table #temp
。
產量
value converted same
---------------------- -------------------------- -----------
0.73 0.73 1
0 0 1
0.63921 0.63921 1
-0.70945 -0.70945 1
0.28 0.28 1
0.72000002861023 0.72000002861023 1
3.7 3.7 1
-0.01 -0.01 1
0.86 0.86 1
0.55489 0.55489 1
0.439999997615814 0.439999997615814 1
。
警告
所有轉換後的字符串都以18位小數位截斷,並且沒有尾隨零。 18位精度對我們來說不是問題。 而且,我們的FP編號(接近100,000個值)的100%看起來與字符串值相同,如同它們在數據庫中與FP編號一樣。
有用的主題謝謝。
如果你想像我一樣刪除前導零你可以使用:
DECLARE @MyFloat [float];
SET @MyFloat = 1000109360.050;
SELECT REPLACE(RTRIM(REPLACE(REPLACE(RTRIM(LTRIM(REPLACE(STR(@MyFloat, 38, 16), '0', ' '))), ' ', '0'),'.',' ')),' ',',')
根據分子的答案:
DECLARE @F FLOAT = 1000000000.1234;
SELECT @F AS Original, CAST(FORMAT(@F, N'#.##############################') AS VARCHAR) AS Formatted;
SET @F = 823399066925.049
SELECT @F AS Original, CAST(@F AS VARCHAR) AS Formatted
UNION ALL SELECT @F AS Original, CONVERT(VARCHAR(128), @F, 128) AS Formatted
UNION ALL SELECT @F AS Original, CAST(FORMAT(@F, N'G') AS VARCHAR) AS Formatted;
SET @F = 0.502184537571209
SELECT @F AS Original, CAST(@F AS VARCHAR) AS Formatted
UNION ALL SELECT @F AS Original, CONVERT(VARCHAR(128), @F, 128) AS Formatted
UNION ALL SELECT @F AS Original, CAST(FORMAT(@F, N'G') AS VARCHAR) AS Formatted;
這是我最終在sqlserver 2012中使用的解決方案(因為所有其他建議都有截斷小數部分或其他缺點的缺點)。
declare @float float = 1000000000.1234;
select format(@float, N'#.##############################');
輸出:
1000000000.1234
這有更多的優勢(在我的情況下)使千位分隔符和本地化變得簡單:
select format(@float, N'#,##0.##########', 'de-DE');
輸出:
1.000.000.000,1234
選擇
(替換(convert(decimal(15,2),acs_daily_debit),'。',',')as varchar(20))
來自acs_balance_details
select replace(myFloat, '', '')
來自REPLACE()文檔 :
如果其中一個輸入參數是nvarchar數據類型,則返回nvarchar; 否則,REPLACE返回varchar。
如果其中任何一個參數為NULL,則返回NULL。
測試:
null ==> [NULL]
1.11 ==> 1.11
1.10 ==> 1.1
1.00 ==> 1
0.00 ==> 0
-1.10 ==> -1.1
0.00001 ==> 1e-005
0.000011 ==> 1.1e-005