Преобразование географической широты и долготы SQL в VARCHAR без потери точности

У меня есть столбец географии под названием «Местоположение». Мне нужно ВЫБРАТЬ Location.Lat и Location.Long как один результат VARCHAR. Используя следующее, я теряю точность:

Запрос:

SELECT CONVERT(VARCHAR(MAX), Location.Lat) + ' ' + CONVERT(VARCHAR(MAX), Location.Long)

Исходное местоположение. Широта: 52.2708633333333

Исходное местоположение. Длинный: -9.73093666666667

Форма результатов выше: 52.2709 -9.73094

Я понимаю, что это связано с тем, что Lat и Long являются плавающими и не имеют указанной точности, поэтому возможным обходным путем было бы сначала заставить его десятичное число с указанной точностью, а затем преобразовать его в varchar. Это кажется..... неуклюжим, и необходимость выбирать случайную точность заставит либо

(a) потеря конечных значений, если они слишком малы или

(b) дополнительные ненужные конечные значения.

Пожалуйста, скажите мне, что мне не хватает функции или метода преобразования, чтобы вернуть их как точные представления varchar!


person KrustyGString    schedule 09.07.2015    source источник
comment
С какой точностью вы изначально измерили широту и долготу? Вы в курсе, что в четвертом десятичном знаке ваша точность составляет ~ 10 метров? У вас действительно есть измерения, которые настолько более точны, что вам нужно сохранить дополнительные цифры?   -  person Damien_The_Unbeliever    schedule 09.07.2015
comment
Да, я думаю, что 5 или 6 знаков после запятой были бы достаточно точными, но мне не нравится жестко кодировать произвольное значение, которое приводит к потере точности (независимо от того, насколько оно незначительно, если оно находится в значении географии, которое я хотел бы использовать)   -  person KrustyGString    schedule 09.07.2015


Ответы (2)


Вам нужно что-то вроде этого:

SELECT CONVERT(VARCHAR(40),CAST(Location.Lat AS decimal(18,14))) + ' ' 
+ CONVERT(VARCHAR(40),CAST(Location.Long AS decimal(18,14))) 
person Thanos Markou    schedule 09.07.2015
comment
Спасибо Танос. Если я не смогу найти более аккуратный способ, я думаю, мне придется использовать что-то вроде этого. - person KrustyGString; 09.07.2015
comment
@KrustyGString Приятно знать, что я помог! - person Thanos Markou; 09.07.2015

Думаю, мне придется ответить на свой вопрос здесь, поскольку кажется, что нет функций, соответствующих критериям.

Чтобы получить желаемые результаты, по-видимому, необходимо использовать обходной путь, например, сначала заставить его десятичное число с указанной точностью, а затем преобразовать его в varchar (ответ Таноса предоставил образец этого, если это необходимо)

person KrustyGString    schedule 23.07.2015
comment
Я думаю, вы должны принять ответ @Thanos вместо того, чтобы публиковать новый. - person SepehrM; 23.11.2016
comment
Я частично согласен, поэтому перейду к принятию ответа Таноса, но еще не решил. Я специально спросил, есть ли что-то, чтобы мне не пришлось использовать обходной путь, как предложил Танос, поэтому моего собственного ответа на то, что я искал, не существует, но обходной путь полезен, поэтому я буду использовать его. - person KrustyGString; 29.11.2016