我的纬度和经度表存储为浮点数。我如何计算纬度列中小数点右边的位数?数据看起来像这样:
DECLARE @MyData TABLE (ID, Latitude float, Longitude float)
INSERT @MyData
SELECT 'A', 33.11, -55.2235 UNION ALL
SELECT 'B', 33.6407760431,-87.0002760543 UNION ALL
SELECT 'C', 42.2997,-70.9081;
我想要这个
ID | LatitudeNumberOfDigits
A | 2
B | 10
C | 4
我试图将其转换为文本并使用a将其拆分。作为分隔符,但CONVERT没有按预期工作。它四舍五入到四位有效数字
SELECT ID, Latitude, Longitude,
CONVERT(varchar(max),[Latitude]) AS LatText
FROM @MyData
给我
ID Latitude Longitude LatText
A 33.11 -55.2235 33.11
B 33.6407760431 -87.0002760543 33.6408
C 42.2997 -70.9081 42.2997
谢谢!
答案 0 :(得分:3)
试试这个(它假设您的浮点数最多有10个小数位,否则调整STR中的值)。
WITH MyData (ID, Latitude, Longitude)
AS
(
SELECT 'A', CAST(33.11 AS FLOAT), CAST(-55.2235 AS FLOAT) UNION ALL
SELECT 'B', 33.6407760431,-87.0002760543 UNION ALL
SELECT 'C', 42.2997,-70.9081
)
SELECT ID, Latitude, Longitude,
LEN(CAST(REVERSE(SUBSTRING(STR([Latitude], 13, 11), CHARINDEX('.', STR([Latitude], 13, 11)) + 1, 20)) AS INT)) AS LatText
FROM MyData
然而,正如其他人所指出的那样,FLOAT可能会给你带来一些麻烦。 以此为例:
SELECT STR(33.11, 20,17) -- result: 33.1099999999999990
答案 1 :(得分:1)
你没有。小数位数由SQL中float的大小决定。 SEE的数量由浮动格式的确定方式决定。
答案 2 :(得分:1)
使用DECIMAL而不是FLOAT:
DECLARE @a FLOAT = 33.6407760431
SELECT CAST(@a AS VARCHAR(100))
DECLARE @b DECIMAL(22,10) = 33.6407760431
SELECT CAST(@b AS VARCHAR(100))
返回:
33.6408
33.6407760431
答案 3 :(得分:1)
转换为数字(maxprecision,maxscale)。然后用case语句迭代。
declare @value as numeric(19,5) = 123.12647
select
CASE WHEN @value = round(@value,0) then 0
WHEN @value = round(@value,1) then 1
WHEN @value = round(@value,2) then 2
WHEN @value = round(@value,3) then 3
WHEN @value = round(@value,4) then 4
else 5 end
答案 4 :(得分:0)
这可能不是有效的tsql,但它会关闭:
SELECT LENGTH(CONVERT(varchar(255), Latitude - CAST (Latitude as int))) AS decimal_place_count
答案 5 :(得分:0)
使用STR
功能代替CONVERT
或CAST
。它允许您更多地控制小数位数和字符串的总长度。见STR (Transact-SQL)
LEN(RTRIM(REPLACE(STR(Latitude,15,10),'0',' '))) - 5