Функции CEILING и FLOOR

Функция CEILING

Функция CEILING возвращает наименьшее целое число, которое больше или равно числовому выражению, являющемуся аргументом функции.

Следующий запрос

SELECT 6.28 val, CEILING(6.28) pos_val, CEILING(-6.28) neg_val;
🚫
[[ error ]]
[[ column ]]
NULL [[ value ]]

даст такие результаты:

valpos_valneg_val
6.287-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;
🚫
[[ error ]]
[[ column ]]
NULL [[ value ]]
ex_numapr_nummoney_num
777,0000

При использовании других клиентских программ/драйверов вы вполне можете получить другое визуальное представление данных. Выполните, например, последний запрос непосредственно в учебнике. Что у вас получилось?

Можно сказать, что формат отображения является лишь “косвенной уликой” относительно вердикта о типе данных результата. Более надежным критерием является объём, который значение занимает в памяти.

SELECT DATALENGTH(6.28) val,
       DATALENGTH(CEILING(6.28)) num_val,
       DATALENGTH(CAST(CEILING(6.28) as INT)) int_val;
🚫
[[ error ]]
[[ column ]]
NULL [[ value ]]
valnum_valint_val
554

Т.е. результат применения функции CEILING занимает в памяти столько же места, что и исходное значение, в то время как результат, явно преобразованный к целому типу, - 4 байта.

Функция FLOOR

Функция FLOOR, напротив, возвращает наибольшее целое число, которое меньше или равно числовому выражению, являющемуся аргументом функции.

SELECT 6.28 val, FLOOR(6.28) pos_val, FLOOR(-6.28) neg_val;
🚫
[[ error ]]
[[ column ]]
NULL [[ value ]]
valpos_valneg_val
6.286-7