Re: Smallmoney and money rounded to 2 decimals?

Sebastien FLAESCH <[email protected]> Mon, 16 Apr 2018 11:45:40 +0200
Newsgroups gmane.comp.db.tds.freetds
Organization Four Js Development Tools
Message-ID <[email protected]>
On 04/16/2018 11:39 AM, Frediano Ziglio wrote:
> 2018-04-12 9:37 GMT+01:00 Sebastien FLAESCH <[email protected]>:
>> On 04/12/2018 09:41 AM, Frediano Ziglio wrote:
>>>
>>> 2018-04-06 12:59 GMT+01:00 Sebastien FLAESCH <[email protected]>:
>>>>
>>>> Hi all,
>>>>
>>>> Using FreeTDS 1.00.9:
>>>>
>>>> When fetching a smallmoney or money data, SQLDescribeCol() returns
>>>> the sqltype SQL_DECIMAL, precision 10 for smallmoney and or 19 for
>>>> money and a scale of 4 for both types, which is fine, since smallmoney
>>>> and money can store 4 decimal digits.
>>>>
>>>> Using an SQL_C_CHAR buffer to hold the values, we see that the decimal
>>>> part is rounded to 2 digits...
>>>>
>>>> Is this expected?
>>>>
>>>> using other ODBC drivers for SQL Server we get 4 decimal digits.
>>>>
>>>> Is there some configuration settings to control this?
>>>>
>>>> Thanks!
>>>> Seb
>>>
>>>
>>> Just checked. Yes, apparently Microsoft ODBC drivers format money with
>>> 4 decimal digit.
>>> I think in the past tools used 2 digits but they moved to 4 along the way.
>>> There's actually no way to change that behavior but probably there should
>>> be.
>>> The 2 digits code is currently quite hard coded in src/tds/convert.c
>>> and src/tds/numeric.c.
>>> I suppose a good way would be to add a flag to TDSCONTEXT (which is
>>> used during conversion to pass locale information).
>>>
>>> Frediano
>>> _______________________________________________
>>> FreeTDS mailing list
>>> [email protected]
>>> https://lists.ibiblio.org/mailman/listinfo/freetds
>>>
>>
>> Hello Frediano, and thanks for considering this!
>>
>> I am not familiar with FreeTDS code internals and TDSCONTEXT.
>>
>> I you want to keep backward compatibility, I assume that there will be a new
>> ODBC connection attribute to control that.
>>
>> http://www.freetds.org/userguide/odbcconnattr.htm
>>
>> And if we consider the current behavior as a bug, the default should be 4
>> decimal
>> digits, and people expecting 2 will have to define the parameter.
>>
>> MoneyFormatDecDigits=2
>>
>> You may also consider rounding issues:
>> Currently FreeTDS rounds to 2 digits...
>> What happens with a db value like 0.1160 ?
>> To be fetched as 0.12, or as 0.11 ?
>> When 0.11, is this data loss or ok?
>> It's monetary data!
>>
>> I vote for a bug => return always 4 digits.
>>
>>
>> Seb
> 
> Got some patches in both Branch-1_00 and master.
> On master ODBC uses always 4 digits. I'm considering if this should be
> backported too.
> Maybe I should just use 4 digits by default, I don't see much
> breakage, also considering
> Fredy comment on BCP exporting/importing MONEY with bcp surrently is loosing
> precision, which is not something we want.
> 
> Frediano
> _______________________________________________
> FreeTDS mailing list
> [email protected]
> https://lists.ibiblio.org/mailman/listinfo/freetds
> 

Hi Frediano!

Sounds good... thanks a lot.

Seb