2013-02-01 4 views
2

Во-первых, я должен упомянуть, что моя текущая версия sbbase db - это Adaptive Server Enterprise 12.5.4. Я пытаюсь преобразовать тип данных float в varchar через функцию преобразования sybase для того, чтобы concat несколько из этих типов переменных, форматировать и хранить в строковом типе.Sybase convert issue from float to varchar

К сожалению, это не так. Просто используя convert(varchar(20), float_var) или cast() функция не может правильно вернуть точное значение.

Например, ...

declare @float_var float 
begin 
    select @float_var =345.1237 --from table actually 
    select convert(varchar(20),@float_var)  --return 345.1236999999 
end 

Неверные результаты возвращаемая строка иногда имеют 99999 или 00001 суффикс.

Я пробовал много функций, включая указание точности, но есть еще несколько случаев, не работающих над ним. Внутренняя функция sybase точно не работает на нем.

Я полагаю, что это проблема с gerneral при использовании Sybase DB, однако мало ответов найдено в serach. Во время моего прошлого опыта Sybase store gammer всегда имеет своего рода допуск во время выполнения и внутреннее исправление при возникновении ошибки. Этот вопрос заставляет меня смутить, как Sybase работает внутри компании. Любой совет будет оценен, спасибо заранее.

ответ

2

Есть несколько возможных решений для этого.

Во-первых, давайте попробуем сначала преобразовать поплавок в десятичный, затем в varchar.

select cast(cast(@float_var as decimal(13,4)) as varchar) 

в качестве альтернативы, и это где моя память ASE может не меня немного, было бы использовать функцию STR так:

Select ltrim(str(@float_var, 25, 5)) 

Вы должны TRIM вывод как функции STR заполнения пустые пространства на слева от результата

+0

Учитывая precsii on of float data type, я попытался использовать case # 1 cast (cast (@float_var как десятичный (38,15)) как varchar), но все же несколько номеров не могут пройти тест, например 96.332, возвращающийся 96.33199999999999494 –

+0

, каков ваш точный желаемый результат?? – SQLGuru

+0

Спасибо за ваш быстрый ответ. Основной целью этого является преобразование типа данных float в строковый тип данных без потери точности, или, другими словами, значение этого столбца типа float должно быть полностью эквивалентно его преобразованной строке при отображении в виде выбора. Мне нужна общая функция, чтобы покрыть это (от float до varchar) без потери точности или масштаба. @SQLGuru –

1

это работает для меня:

declare @float_var float 
begin 
    select @float_var = 96.332 
    select cast(cast(@float_var as decimal(13,4)) as varchar)  -- Returns 96.3320 
end 

declare @float_var float 
begin 
    select @float_var = 345.1237 
    select cast(cast(@float_var as decimal(13,4)) as varchar)  -- Returns 345.1237 
end 
+0

Да, ссылка на функцию десятичная (точность, масштаб), в настоящее время точность = 13, шкала = 4, если масштаб выше 4, это значение жесткого кода. Выясните меня, еще один вопрос: лучше ли я исследовать максимальный масштаб, относящийся к типу столбца моей таблицы, и hardcode для этого масштаба этой десятичной функции, чтобы удовлетворить потребность в подгонке каждого точного значения внутри этого столбца при преобразовании? –

+0

Обратите внимание, что это реальное значение поплавка (определение типа данных float float) поступает из системы восходящего потока, для меня довольно сложно оценить максимальный масштаб или точность при доступе к данным. Вот почему мне нужна общая функция для покрытия всех возможных случаев. –

+0

Да, я бы использовал значение hiest для шкалы ... почему бы просто не использовать существующее определение типа данных для этого столбца. Затем конвертируйте в varchar ... – SQLGuru