-
В таблице есть поле float. В запросе это поле нужно представить в виде двух натуральных чисел - целая и дробная части без округлений. Делаю с помощью строковых функций - получилась громоздкая конструкция. Уверена, что можно сделать проще, не могу найти как.
IF object_id('tempdb..#tmp') is not null DROP TABLE #tmp CREATE TABLE #tmp(val2 float) INSERT INTO #tmp VALUES (-956.5)
SELECT ABS(cast(CASE WHEN CHARINDEX('.',cast(val2 as varchar(20)))>0 THEN substring(cast(val2 as varchar(20)),1,CHARINDEX('.',cast(val2 as varchar(20)))-1) ELSE NULL END as int)), cast(CASE WHEN CHARINDEX('.',cast(val2 as varchar(20)))>0 THEN substring(cast(val2 as varchar(20)),CHARINDEX('.',cast(val2 as varchar(20)))+1,2) ELSE NULL END as int) FROM #tmp
-
Я бы в numeric сначала попробовал скастовать, а дальше уже с ним игрался бы.
-
А зачем понадобилась дробная часть плавающего числа как целое БЕЗ ОКРУГЛЕНИЯ ?
-
> А зачем понадобилась дробная часть плавающего числа как > целое БЕЗ ОКРУГЛЕНИЯ
Так у заказчика хранятся данные (таблица создана до рождения Билла Гейтса): целая часть - количество "табуреток", дробная - количество "валенок". Делаю нормальную БД, нужно перенести данные.
-
>Ольга © (07.07.09 11:22) floor, round, ceiling не работают?
-
> floor, round, ceiling не работают?
Эти функции округляют: 956.5 -> 957 5
-
> Ольга (07.07.2009 11:54:03) [3]
Вероятнее всего получишь 0.33333 валенка
-
> Ольга (07.07.2009 11:59:05) [5]
Зато 956.5 - Int(Num) не округляют
-
> Ольга (07.07.2009 11:54:03) [3]
Я вообще много чудес видел, но данный заказчик всех переплюнул.
-
>Ольга © (07.07.09 11:59) [5] ну, а если подумать, то нечто вроде: round(x - 0.5)
-
> ну, а если подумать, то нечто вроде: > round(x - 0.5)
Не факт.
-
>Ega23 © (07.07.09 12:17) [10] тогда строго из BOL: SELECT ROUND(150.75, 0, 1); GO
-
Попробовала с numeric - стало еще хуже, в дробной части незначимые нули.
> SELECT ROUND(150.75, 0, 1);
А вот это вроде то, что надо (до последней строчки мануала не дочитала)
-
И так, табуретки теперь преобразовываются просто. А с "валенками" не получается:
IF object_id('tempdb..#tmp') is not null DROP TABLE #tmp
CREATE TABLE #tmp(val2 float)
INSERT INTO #tmp VALUES (-956.5)
INSERT INTO #tmp VALUES (959.49)
SELECT ABS(cast(ROUND(val2,0,1) as int)),
cast(CASE WHEN CHARINDEX('.',cast(val2 as varchar(20)))>0
THEN substring(cast(val2 as varchar(20)),CHARINDEX('.',cast(val2 as varchar(20)))+1,2)
ELSE NULL END as int)
FROM #tmp ELSE NULL END as int)
Есть еще идеи? Это мне нужно не из любви к искусству, количество "валенок" нужно несколько раз использовать в предлжении WHERE
-
> количество "валенок" нужно несколько раз использовать в > предлжении WHERE
сделай вложенный запрос и не парься.
-
>Ольга © (07.07.09 12:53) [13] >CHARINDEX('.' в MS SQL разделитель не зависит от локали?)
если абстрактно, то: целая часть: ABS(cast(ROUND(val2,0,1) as int)) => дробная: frac = abs(val2) - ABS(cast(ROUND(val2,0,1) as int)) => искомое int2 = cast(frac * power(10, len(cast(frac as varchar(20)))-2) as int)
-
> Ольга © (07.07.09 12:53) [13]
Поиграй с запросом DECLARE @N float;
SET @N=-750.158;
select ROUND(@N,0,1) as C,ROUND(@N-ROUND(@N,0,1),3) as FR А если и дробную часть надо как целую, то почему бы ее не умножить... на 10 или 100 или 1000 или сколько знаков дробной там надо учесть прямо в запросе?
-
> Ольга © (07.07.09 11:54) [3] > ...целая часть - количество "табуреток", дробная - количество "валенок".
0.1 это сколько валенок, 1 или 10? а может быть 1000000?
-
>topS (07.07.09 14:36) [17]
>дробная - количество "валенок".
-
> Кщд (07.07.09 14:53) [18]
кому нужны ошметки валенок?
|