2013-02-01 1 views
2

먼저 현재 sybase db 버전이 입니다. Adaptive Server Enterprise 12.5.4입니다. 나는 varchar으로 float 데이터 형식을 sybase 변환 함수를 통해 concat 변수의 이러한 종류 중 몇 가지를 순서대로 문자열 형식으로 변환하는 것을 목표로합니다.Sybase에서 float에서 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 내부 함수가 정확하게 작동하지 않습니다.

나는 Sybase DB를 사용하는 동안 일반적인 문제라고 생각하지만, serach에서는 거의 답을 찾을 수 없습니다. 과거의 경험을 통해 Sybase 저장 프로 시저 gammer는 오류 발생시 런타임 및 내부 수정시 항상 일정한 허용 오차를 갖습니다. 이 문제는 Sybase가 내부적으로 어떻게 작동하는지 혼란스럽게합니다. 어떤 충고라도 감사 할 것입니다, 미리 감사드립니다.

답변

2

거기에는 몇 가지 가능한 해결책이 있습니다.

먼저 float를 10 진수로 변환 한 다음 varchar로 변환 해 봅시다.

select cast(cast(@float_var as decimal(13,4)) as varchar) 
대안으로

, 내 ASE 메모리가 나에게 조금 실패 할 수 있으므로 같은 STR 기능을 사용하는 것입니다 곳이다 :

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

을 당신이 가지고있는 STR 기능 패딩과 같은 출력을 자릅니다 결과

+0

는 precsii을 고려 float 데이터 형식에 대해 # cast (캐스팅 (cast) (10 진수 (38,15)로 varchar로 @float_var)를 사용하려고했으나 96.332와 같이 테스트를 통과 할 수 없습니다. 96.331999999999994 –

+0

정확히 무엇입니까? 원하는 결과 ?? – SQLGuru

+0

신속한 답변을 보내 주셔서 감사합니다. 이를 수행하는 주요 목적은 정밀도를 잃지 않고 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 이상 스케일 인 경우이 값은 하드 코드입니다. 실례지만 질문을 하나 더 드리겠습니다.이 열의 각 정확한 값을 맞추기위한 요구 사항을 충족시키기 위해 내 테이블의 열 유형을 참조하는 최대 배율을 조사하고이 십진수 함수의이 배율에 대한 하드 코드를 조사하는 것이 좋습니다. 변환하는 동안? –

+0

이 실제 실수 값 (defalut float 데이터 유형을 정의)은 업스트림 시스템에서 나온 것이므로 데이터에 액세스 할 때 최대 배율 또는 정밀도를 평가하는 것은 상당히 어렵습니다. 그래서 모든 가능한 경우를 다루기 위해 제네릭 함수가 필요합니다. –

+0

그래, 난 규모에 대한 가장 가치있는 값을 사용합니다 ... 왜 단순히 해당 열에 대한 기존 데이터 형식 정의를 사용하지 않습니다. 그런 다음 varchar로 변환 ... – SQLGuru

관련 문제