Функции CEILING и FLOOR
Функция CEILING
Функция CEILING возвращает наименьшее целое число, которое больше или равно числовому выражению, являющемуся аргументом функции.
Следующий запрос
SELECT 6.28 val, CEILING(6.28) pos_val, CEILING(-6.28) neg_val;
[[ column ]] |
---|
NULL [[ value ]] |
даст такие результаты:
val | pos_val | neg_val |
---|---|---|
6.28 | 7 | -6 |
Возвращаемый функцией результат имеет тот же тип, что и аргумент функции.
Однако рассмотренный пример вроде бы говорит об обратном. Более того, даже выполнив явное преобразование типа для чисел с фиксированной и плавающей точкой, мы получим в результате целое число за исключением константы типа MONEY (в Management Studio):
SELECT CEILING(CAST(6.28 as DEC(6,2))) ex_num,
CEILING(CAST(6.28 as FLOAT)) apr_num,
CEILING($6.28) money_num;
[[ column ]] |
---|
NULL [[ value ]] |
ex_num | apr_num | money_num |
---|---|---|
7 | 7 | 7,0000 |
При использовании других клиентских программ/драйверов вы вполне можете получить другое визуальное представление данных. Выполните, например, последний запрос непосредственно в учебнике. Что у вас получилось?
Можно сказать, что формат отображения является лишь “косвенной уликой” относительно вердикта о типе данных результата. Более надежным критерием является объём, который значение занимает в памяти.
SELECT DATALENGTH(6.28) val,
DATALENGTH(CEILING(6.28)) num_val,
DATALENGTH(CAST(CEILING(6.28) as INT)) int_val;
[[ column ]] |
---|
NULL [[ value ]] |
val | num_val | int_val |
---|---|---|
5 | 5 | 4 |
Т.е. результат применения функции CEILING занимает в памяти столько же места, что и исходное значение, в то время как результат, явно преобразованный к целому типу, - 4 байта.
Функция FLOOR
Функция FLOOR, напротив, возвращает наибольшее целое число, которое меньше или равно числовому выражению, являющемуся аргументом функции.
SELECT 6.28 val, FLOOR(6.28) pos_val, FLOOR(-6.28) neg_val;
[[ column ]] |
---|
NULL [[ value ]] |
val | pos_val | neg_val |
---|---|---|
6.28 | 6 | -7 |