powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / float select...where
5 сообщений из 5, страница 1 из 1
float select...where
    #32029996
Dimon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня возникла следующая проблема!
Ообъясните, пожалуйста.

SQL Server 2000
Есть таблица:

pole1 pole2
---------------
data1 35.8
data2 35.81


Делаю запрос:
SELECT *
FROM table1
WHERE (pole2 = 35.8 )

Ничего НЕ получается, а на запрос:

Делаю запрос:
SELECT *
FROM table1
WHERE (pole2 = 35.81)

выдается соответственно вторая строка.
Т.е. сравнение может происходить только если не менее двух знаков после запятой!
А занести в таблицу 35.80 нельзя.
Как решить?
Может есть какие-то настройки?
Или я что-то конкретно не понимаю.
...
Рейтинг: 0 / 0
float select...where
    #32030000
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дело не в количестве знаков, просто храниться оно в неком двоичном виде и хоть выводиться как 3.8, может содержать и еще какие разряды.
попробуйте так:
WHERE round(pole2,1) = 35.8
...
Рейтинг: 0 / 0
float select...where
    #32030063
Miha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Некоторые рассуждения не совсем в тему.

Сначала я думал, что такая ситуация обычно возникает когда точность представления float числа
при вставке и/или сравнении больше точности поля в таблице, т.е. следующий код не должен возвращать записей:

create table #tt1 (name char(1), val float(24))
insert into #tt1 values ('a',35.800000001)
select * from #tt1 where ( val = 35.800000001 )
drop table #tt1

но не тут то было! интересно, неужели SQL приводит 35.800000001 в выражении "val = 35.800000001" к float(24)?

create table #tt1 (name char(1), val float(24))
insert into #tt1 values ('a',35.800000001)
select * from #tt1 where ( val = cast(35.800000001 as float(53)) ) -- работает!
select * from #tt1 where ( val = cast(35.800000001 as float(24)) ) -- работает!
select * from #tt1 where ( cast(val as float(53)) = 35.800000001 ) -- нет!
drop table #tt1

из чего можно сделать вывод: если внести во float(n) поле любой точности значение любой точности,
то последующая выборка с where field = <исходное значение> всегда отдаст нужные строки.
...
Рейтинг: 0 / 0
float select...where
    #32030107
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно и другие выводы сделать, например:
при сравнении поля с константой значение константы приводиться к типу поля

а вобще это чисто теоритические рассуждения, не имеющие к жизни никакого отношения
...
Рейтинг: 0 / 0
float select...where
    #32030121
Miha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>>при сравнении поля с константой значение константы приводиться к типу поля
а это зависит от compatibility-level.

Однако операции CAST/CONVERT не могут понизить точность переменных и полей типа float!
По крайней мере в SQL70.
пример:

create table #tt1 (name char(1), val float(53))
insert into #tt1 values ('a',35.800000001)
declare @a float(24)
declare @b float(24)
set @a = 35.800000001
select @b = cast(val as float(24)) from #tt1
select (@a - @b) from #tt1 --возвращается 0, что логично
select (@a - cast(val as float(24))) from #tt1 -- !=0 - точность val не понизилась!
drop table #tt1

интересно, в sql2000 это так же выполняется? не могу проверить.

ЗЫ.
http://support.microsoft.com/default.aspx?scid=kb;RU;q271566
тут описаны различия между sql2000 и sql7 при implicit конверсии типов, но нигде ни слова о таком.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / float select...where
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]