Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 cast & round  [new]
tolik9
Guest
добрый день всем,
select cast(round('222333.0000',0) as varchar)
select cast(round('1222333.0000',0) as varchar)

первая строка дает 222333, а вторая не дает 1222333, что не так?
7 авг 14, 16:01    [16412595]     Ответить | Цитировать Сообщить модератору
 Re: cast & round  [new]
Glory
Member

Откуда:
Сообщений: 104751
tolik9
что не так?

А какой по-вашему мнению должен быть результат ?
7 авг 14, 16:09    [16412662]     Ответить | Цитировать Сообщить модератору
 Re: cast & round  [new]
mrGuest
Guest
tolik9
добрый день всем,
select cast(round('222333.0000',0) as varchar)
select cast(round('1222333.0000',0) as varchar)

первая строка дает 222333, а вторая не дает 1222333, что не так?


Если бы прочитали хелп по функции, то поняли, что по умолчанию вещественные значения конвертируются в "не более 6 разрядов. По необходимости используется экспоненциальное представление чисел."

Воспользуйтесь функцией convert
7 авг 14, 16:17    [16412718]     Ответить | Цитировать Сообщить модератору
 Re: cast & round  [new]
tolik9
Guest
вроде было бы логично если результат = 1222333.

наверное то число что дает (1.22233e+006) = 1222333, если так то можно ли сделать чтобы выводилось именно 1222333 ?
7 авг 14, 16:18    [16412728]     Ответить | Цитировать Сообщить модератору
 Re: cast & round  [new]
mrGuest
Guest
mrGuest
Воспользуйтесь функцией convert

хотел сказать str
7 авг 14, 16:20    [16412747]     Ответить | Цитировать Сообщить модератору
 Re: cast & round  [new]
Glory
Member

Откуда:
Сообщений: 104751
tolik9
вроде было бы логично если результат = 1222333.

Почему для вас логичным видется автоматическое преобразование символьной строки '1222333.0000' именно в целое число ?
7 авг 14, 16:20    [16412752]     Ответить | Цитировать Сообщить модератору
 Re: cast & round  [new]
tolik9
Guest
mrGuest
Воспользуйтесь функцией convert

select convert(varchar, round('222333.0000',0))
select convert(varchar, round('1222333.0000',0))

результат тот же, что и при cast
7 авг 14, 16:21    [16412756]     Ответить | Цитировать Сообщить модератору
 Re: cast & round  [new]
mrGuest
Guest
tolik9
вроде было бы логично если результат = 1222333.

наверное то число что дает (1.22233e+006) = 1222333, если так то можно ли сделать чтобы выводилось именно 1222333 ?


Логично, это если результат совпадает с описанием функции.
7 авг 14, 16:22    [16412767]     Ответить | Цитировать Сообщить модератору
 Re: cast & round  [new]
Glory
Member

Откуда:
Сообщений: 104751
tolik9
результат тот же, что и при cast

Потому, что до конвертации в строку и округления происходит еще преобразование символьного типа к числовому.
7 авг 14, 16:24    [16412778]     Ответить | Цитировать Сообщить модератору
 Re: cast & round  [new]
tolik9
Guest
хотелось бы получить '1222333'
select cast(round(1222333.0000,0) as varchar)
select cast(round(cast('1222333.0000' as decimal(18,4)),0) as varchar)

дает '1222333.0000', наверное так и должно быть, но как из символьного '1222333.0000' получить '1222333', точно также из '1222333.0259'->'1222333' ?

попробовал так:
select cast(round('1222333.0000',0) as int)

это дало 1222333, этот способ не кроет в себе какие либо ошибки?
7 авг 14, 16:31    [16412841]     Ответить | Цитировать Сообщить модератору
 Re: cast & round  [new]
Glory
Member

Откуда:
Сообщений: 104751
tolik9
но как из символьного '1222333.0000' получить '1222333

Научиться различать целочисленные типы данных и дробные ?
7 авг 14, 16:33    [16412850]     Ответить | Цитировать Сообщить модератору
 Re: cast & round  [new]
mrGuest
Guest
tolik9,

А слона-то Вы и не заметили среди ответов...

select str('1222333.0000') -- просто
select ltrim(str('1222333.0000')) -- если не нужны пробелы вначале
select ltrim(str('1222333.0000', 50)) -- если предполагается, что могут быть числа более 10 знаков, но не более 50.. цифру можно поменять


Читайте BOL
7 авг 14, 16:44    [16412957]     Ответить | Цитировать Сообщить модератору
 Re: cast & round  [new]
tolik9
Guest
2Glory - а что скажете по поводу
select cast(round('1222333.0000',0) as int)
?

Целочисленные типы данных и дробные вроде различаю, дело в том, что поддерживаю базу, где в поле decimal(18,4) хранятся как дробные (доля чего-либо) так и целочисленные данные (кол-во людей).

При выводе на форму нужно, чтобы целочисленные отображались без дробной части, т.е. без ".0000"

Подозреваю, что дело не в неправильной конвертации, т.к. значения до 6 знаков выводятся как надо, а в том, что как сказал mrGuest функции cast и convert по умолчанию вещественные значения конвертируются в не более 6 разрядов.

Хотелось бы узнать, как сделать "не по умолчанию"...
7 авг 14, 16:48    [16413004]     Ответить | Цитировать Сообщить модератору
 Re: cast & round  [new]
Glory
Member

Откуда:
Сообщений: 104751
tolik9
2Glory - а что скажете по поводу
select cast(round('1222333.0000',0) as int)

?

16412778

tolik9
Целочисленные типы данных и дробные вроде различаю, дело в том, что поддерживаю базу, где в поле decimal(18,4) хранятся как дробные (доля чего-либо) так и целочисленные данные (кол-во людей).

То, что в decimal(18,4) хранится число с нулями в дробной части, не делает его целочислинным типом данных

tolik9
Подозреваю, что дело не в неправильной конвертации,

Это для вас она неправильная. Вы же не указали серверу, как именно он должен конвертировать строку '1222333.0000' в число
7 авг 14, 16:51    [16413034]     Ответить | Цитировать Сообщить модератору
 Re: cast & round  [new]
tolik9
Guest
mrGuest
tolik9,

А слона-то Вы и не заметили среди ответов...

select str('1222333.0000') -- просто
select ltrim(str('1222333.0000')) -- если не нужны пробелы вначале
select ltrim(str('1222333.0000', 50)) -- если предполагается, что могут быть числа более 10 знаков, но не более 50.. цифру можно поменять


Читайте BOL


троллите? при чем тут "если не нужны пробелы вначале" ?
7 авг 14, 16:52    [16413041]     Ответить | Цитировать Сообщить модератору
 Re: cast & round  [new]
tolik9
Guest
2Glory
select cast(round(cast('1222333.0000' as decimal(18,4)),0) as int)

будет правильным 100%, чтобы получить из символьного '1222333.0000' или '1222333.0259' число 1222333 ?
7 авг 14, 16:56    [16413081]     Ответить | Цитировать Сообщить модератору
 Re: cast & round  [new]
tolik9
Guest
наверное точнее
select cast(cast('1222333.0000' as decimal(18,4)) as int)


спасибо всем!
7 авг 14, 16:58    [16413094]     Ответить | Цитировать Сообщить модератору
 Re: cast & round  [new]
Glory
Member

Откуда:
Сообщений: 104751
tolik9
будет правильным 100%, чтобы получить из символьного '1222333.0000' или '1222333.0259' число 1222333 ?

Нет.
Потому что decimal(18,4) и integer - это разные типы данных. Которые вы "различаете"
7 авг 14, 16:58    [16413101]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить