FLOOR, CEIL и CEILING в SQL: округление до целого вверх и вниз

FLOOR округляет число вниз (к меньшему целому, в сторону −∞), а CEIL и его синоним CEILING — вверх (к большему целому). Аналитику это нужно для бакетирования: сгруппировать суммы по сотням, возраст по десяткам, посчитать число страниц пагинации. В PostgreSQL и MySQL функции есть всегда; в SQLite они относятся к математическому расширению (с версии 3.35), которое включено в официальных сборках, но само по себе ABS и ROUND ядерные, а FLOOR/CEIL — нет.

Синтаксис

FLOOR(numeric_expression) CEIL(numeric_expression) -- синоним CEILING() CEILING(numeric_expression)

Примеры использования

Пример 1: Округление сумм платежей в обе стороны

SELECT amount,
       FLOOR(amount) AS floor_amount,
       CEIL(amount)  AS ceil_amount
FROM payments
LIMIT 3;

Результат:

amount  | floor_amount | ceil_amount
1490.20 |         1490 |        1491
 999.90 |          999 |        1000
 -50.50 |          -51 |         -50

Пример 2: Бакетирование платежей по тысячам

SELECT FLOOR(amount / 1000) * 1000 AS bucket,
       COUNT(*) AS payments
FROM payments
GROUP BY FLOOR(amount / 1000) * 1000
ORDER BY bucket;

Результат:

bucket | payments
     0 |      120
  1000 |       58
  2000 |       14

Пример 3: Сколько страниц по 50 заказов

SELECT CEIL(COUNT(*) / 50.0) AS pages
FROM orders;

Результат:

pages
   37
Порешать SQL-задачи в тренажёре →

Типичная ошибка

FLOOR/CEIL сохраняют тип аргумента: FLOOR(numeric) вернёт numeric, а не integer — оберните в CAST(... AS int), если нужен целочисленный тип. FLOOR округляет в сторону −∞, поэтому FLOOR(−50.5) = −51, а не −50 (это отличает её от усечения TRUNC). И следите за целочисленным делением внутри: amount/1000 при integer-операндах обрежется ещё до FLOOR.

Где спрашивают на собеседовании

На собеседовании всплывает в задачах на гистограммы, бины и пагинацию («разложите суммы по диапазонам»). Идёт в паре с ROUND, TRUNC и целочисленным делением.

FAQ: частые вопросы про FLOOR / CEIL

Чем FLOOR отличается от ROUND и TRUNC?

FLOOR всегда округляет вниз (к −∞), ROUND — к ближайшему целому по правилам округления, TRUNC просто отбрасывает дробную часть в сторону нуля. Для положительных чисел FLOOR и TRUNC совпадают, а для отрицательных нет: FLOOR(−2.3) = −3, TRUNC(−2.3) = −2. Выбирайте функцию под смысл: бины — FLOOR, обрезка — TRUNC.

Как FLOOR и CEIL ведут себя с отрицательными числами?

FLOOR(−2.1) = −3, потому что округление идёт к меньшему числу. CEIL(−2.1) = −2, потому что вверх, то есть к большему. Это частая ловушка: для отрицательных значений FLOOR даёт результат «дальше от нуля», а CEIL — «ближе к нулю».

Есть ли FLOOR и CEIL в SQLite?

Да, но это функции математического расширения, добавленного в SQLite 3.35 (2021) и включаемого флагом сборки SQLITE_ENABLE_MATH_FUNCTIONS. В официальных предсобранных бинарниках оно активно, так что floor(), ceil() и ceiling() работают. Но ABS и ROUND — ядерные и доступны всегда, а FLOOR/CEIL могут отсутствовать в кастомной сборке без математики.

Задачи в тренажёре по теме

Смежные темы SQL

Агрегации

Другие функции SQL

STRING_AGG · COUNT · SUM OVER · ROUND · UPPER / LOWER · LENGTH

Открыть SQL-тренажёр (565 задач) →