Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Вырезать дробную часть числа.  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 787
Здравствуйте. Посоветуйте, пожалуйста, как мне решить такую проблему.
Есть переменная @L - число объявленное как Decimal(25,3).Нужно вырезать из него целую и дробную часть. Целую часть мне вырезать удалось, а вот дробную пока нет.
Можно, конечно, перевести это число в тип varchar и его ковырять, но у меня так не получилось.

P.S. может функция есть какая недокументированная?
24 май 07, 16:31    [4181255]     Ответить | Цитировать Сообщить модератору
 Re: Вырезать дробную часть числа.  [new]
Glory
Member

Откуда:
Сообщений: 104764
andron81
Здравствуйте. Посоветуйте, пожалуйста, как мне решить такую проблему.
Есть переменная @L - число объявленное как Decimal(25,3).Нужно вырезать из него целую и дробную часть. Целую часть мне вырезать удалось, а вот дробную пока нет.
Можно, конечно, перевести это число в тип varchar и его ковырять, но у меня так не получилось.

А отнять о числа "верезанную целую часть" не пробовали ?
24 май 07, 16:36    [4181280]     Ответить | Цитировать Сообщить модератору
 Re: Вырезать дробную часть числа.  [new]
Anatoly Podgoretsky
Member

Откуда:
Сообщений: 62926
Дробная = все число - целая часть, это если без привлечения функций
24 май 07, 16:36    [4181284]     Ответить | Цитировать Сообщить модератору
 Re: Вырезать дробную часть числа.  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 787
Glory
А отнять о числа "верезанную целую часть" не пробовали ?

Побовал - это первое, что пришло мне на ум. Однака мне надо чтобы например при @L=4551.6
В переменную @L1 забилось значение 4551, а в переменную @L2 забилось значение 6 (но не как не 0.6) !
Пробовал с переводом в varchar баловаться. И вот сложности: если @L =4551.6 , то
SELECT cast(@L,varchar) выдаст 4551.600 (правильно 3 знака после запятой объявлено в переменной) и как с ним быть я не сооброжу. Если бы подсказали такой перевод, чтобы выдавал 4551.6 был бы очень благодарен.
24 май 07, 16:55    [4181386]     Ответить | Цитировать Сообщить модератору
 Re: Вырезать дробную часть числа.  [new]
Glory
Member

Откуда:
Сообщений: 104764
andron81
Glory
А отнять о числа "верезанную целую часть" не пробовали ?

Побовал - это первое, что пришло мне на ум. Однака мне надо чтобы например при @L=4551.6
В переменную @L1 забилось значение 4551, а в переменную @L2 забилось значение 6 (но не как не 0.6) !

Интересная логика, а при 4551.06, что должно быть в @L2 ?
24 май 07, 17:00    [4181423]     Ответить | Цитировать Сообщить модератору
 Re: Вырезать дробную часть числа.  [new]
BugsBunny
Member

Откуда: GMT+5=EST
Сообщений: 2414
declare @x decimal(25,3); set @x = 4551.6
select round(@x, 0, 1), @x - round(@x, 0, 1)
24 май 07, 17:03    [4181448]     Ответить | Цитировать Сообщить модератору
 Re: Вырезать дробную часть числа.  [new]
Glory
Member

Откуда:
Сообщений: 104764
andron81

SELECT cast(@L,varchar) выдаст 4551.600 (правильно 3 знака после запятой объявлено в переменной) и как с ним быть я не сооброжу. Если бы подсказали такой перевод, чтобы выдавал 4551.6 был бы очень благодарен.

С этим надо бороться в клиентском приложении. Через задание какиз-нибудь масок отображения
24 май 07, 17:08    [4181478]     Ответить | Цитировать Сообщить модератору
 Re: Вырезать дробную часть числа.  [new]
BugsBunny
Member

Откуда: GMT+5=EST
Сообщений: 2414
andron81
...
P.S. может функция есть какая недокументированная?

Apparently, 2005 had convert style 128 ( "To remove trailing zeros from a result set when you convert from numeric or decimal data to character data, use the value 128 for style. ") but it wasn't working (Bug ID :FDBK48122) and the BOL was fixed rather than source code.

And I totaly agree with Glory that presentation should be done on client.
BTW, look how ugly it can be done on TSQL:
declare @x decimal(25,3); set @x = 4551.6
select cast(cast(round(@x, 0, 1) as int) as varchar(25)) 
    + '.' 
    +  reverse(cast(round(reverse(cast(@x - round(@x, 0, 1) as varchar(25))),0,1) as varchar(25)))
24 май 07, 17:26    [4181605]     Ответить | Цитировать Сообщить модератору
 Re: Вырезать дробную часть числа.  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
автор
SELECT cast(@L,varchar) выдаст 4551.600 (правильно 3 знака после запятой объявлено в переменной) и как с ним быть я не сооброжу. Если бы подсказали такой перевод, чтобы выдавал 4551.6 был бы очень благодарен.


а зачем ВЫ вообще к строке приводите числовые данные, на которые можно формат отображения наложить?!
24 май 07, 17:29    [4181618]     Ответить | Цитировать Сообщить модератору
 Re: Вырезать дробную часть числа.  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 787
Glory

С этим надо бороться в клиентском приложении. Через задание какиз-нибудь масок отображения


Боролся если бы это клиентовское приложение было бы написано мной или я бы хотябы имел исходный код на Центуре, а оно написано именно на Центуре. Кстати, вы умеете программировать на Центуре? Просто "МЕГАРАСПРОСТРАНЕННОЕ" средство разработки! :)
А в данном случае все, что я могу сделать это повесить триггер на добавление новой строчки в определенной таблице.
24 май 07, 20:38    [4182261]     Ответить | Цитировать Сообщить модератору
 Re: Вырезать дробную часть числа.  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 787
Glory

Интересная логика, а при 4551.06, что должно быть в @L2 ?


А вот тут действительно Glory несомненно прав(а).
Я об этом не подумал и всех ввел в заблуждение. у меня вводится таблица в некотором закрытом клиентовском приложении, туда пользователь вносит числа типа Decimal(25,3). Но он вносит числа в одних единицах измерения, а мне надо в других(причем чтобы перевести в другие единицы надо отковырять данные из базы). Вот я и решил повесить триггер который будет автоматом переводить в эти единицы измерения.
А что касается чисел 4551.06 то их ползователь не должен вводить.Код BugsBunny действительно помог.
Спасибо.
24 май 07, 21:14    [4182346]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Вырезать дробную часть числа.  [new]
ToOch
Member

Откуда:
Сообщений: 1
У меня есть 2 поля DATETIME, но в одном время, в другом дата:
[Date Archived] = '2018-09-10 00:00:00.000'
[Time Archived] = '1754-01-01 17:47:21.960'
Встал вопрос объединения этих полей в одно. Исходя из соображений, что время это дробная чать числа, я ничего умнее не придумал как написать следующее.

[Date Archived]+CAST([Time Archived] AS FLOAT)-FLOOR(CAST([Time Archived] AS FLOAT))

Думаю, с точки зрения производительности это решение "неОчень", но результат следующий:
[DateTime Archived] = '2018-09-10 17:47:21.963'
5 окт 18, 13:39    [21696347]     Ответить | Цитировать Сообщить модератору
 Re: Вырезать дробную часть числа.  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7407
ToOch,

datetimefromparts()
5 окт 18, 13:47    [21696360]     Ответить | Цитировать Сообщить модератору
 Re: Вырезать дробную часть числа.  [new]
invm
Member

Откуда: Москва
Сообщений: 9128
ToOch,

[Date Archived]+CAST([Time Archived] AS TIME)
5 окт 18, 14:17    [21696401]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить