FLOOR: примеры (SQL)

Округление вниз: работа с функцией FLOOR в Microsoft SQL
Раздел: Математические функции, Математические
FLOOR(numeric_expression): Same as input

Описание функции FLOOR в MS SQL

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

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

Аргументы: функция принимает один обязательный аргумент:
1. numeric_expression - выражение типа exact numeric или approximate numeric, за исключением типа bit. Это может быть константа, переменная, столбец или выражение, возвращающее числовое значение.

Возвращаемое значение: функция возвращает значение того же типа, что и входной аргумент, но без дробной части, округленное вниз.

Примеры использования функции FLOOR

Примеры демонстрируют работу с разными типами чисел и в разных контекстах.

Округление положительных чисел:

SELECT FLOOR(12.34) AS Result;
Result
12

Округление отрицательных чисел:

SELECT FLOOR(-12.34) AS Result;
Result
-13

Округление целого числа:

SELECT FLOOR(100) AS Result;
Result
100

Использование с переменной:

DECLARE @Value DECIMAL(5,2) = 45.67;
SELECT FLOOR(@Value) AS Result;
Result
45

Похожие функции в MS SQL

В MS SQL Server существуют другие функции для работы с округлением и числовыми преобразованиями.

CEILING: функция, округляющая число вверх до ближайшего целого. Используется, когда необходим результат, больший или равный исходному числу.
ROUND: функция для округления числа до указанной длины. Позволяет контролировать точность и направление округления (стандартное или усечение).
CAST и CONVERT: функции преобразования типов. Могут использоваться для явного приведения типа decimal или float к целочисленному типу (например, INT), что аналогично отбрасыванию дробной части, но с отличием в механизме округления (не всегда в меньшую сторону).
TRUNCATE: прямой аналог FLOOR в MS SQL отсутствует, но логику отбрасывания дробной части без округления можно эмулировать с помощью ROUND с функциональностью усечения или с помощью математических операций.

Выбор между FLOOR и CEILING зависит от требуемого направления округления. ROUND более гибкая, когда важна точность. Преобразование типов предпочтительно, когда нужна смена типа данных, а не только математическая операция.

Типичные ошибки при работе с FLOOR

Распространенные ошибки связаны с непониманием типа возвращаемого значения или передачей нечисловых данных.

Ошибка из-за несовместимости типов данных:

SELECT FLOOR('текст');
Сообщение об ошибке: Ошибка преобразования типа данных varchar в float.

Неявное преобразование может дать неожиданный результат вместо ошибки:

SELECT FLOOR('123.45текст');
123

Переполнение при работе с очень большими числами:

SELECT FLOOR(1e1000);
Сообщение об ошибке: Преобразование числа в тип данных numeric привело к переполнению.

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

SELECT FLOOR(-1.5) AS Result;
Result
-2

Изменения в реализации функции

Функция FLOOR в MS SQL Server остается стабильной на протяжении многих версий. Существенных изменений в ее синтаксисе или базовом поведении не происходило.

Косвенные улучшения связаны с общим развитием типов данных и повышением точности вычислений с типами decimal и numeric в новых версиях SQL Server. Также улучшена интеграция с функциями обработки больших данных и оптимизация производительности в сложных запросах.

Рекомендуется обращаться к документации конкретной версии для уточнения особенностей работы с новыми типами данных, такими как определенные форматы float.

Расширенные примеры применения FLOOR

Использование в математических выражениях для создания дискретных групп:

Пример sql
SELECT 
    SaleAmount,
    FLOOR(SaleAmount / 1000) * 1000 AS GroupStart,
    (FLOOR(SaleAmount / 1000) * 1000) + 999 AS GroupEnd
FROM Sales
ORDER BY SaleAmount;

Применение в оконных функциях для расчета накопленных итогов с округлением:

Пример sql
SELECT 
    OrderID,
    OrderAmount,
    SUM(OrderAmount) OVER (ORDER BY OrderID) AS RunningTotal,
    FLOOR(SUM(OrderAmount) OVER (ORDER BY OrderID) / 100) * 100 AS RoundedRunningTotal
FROM Orders;

Обработка значений временных рядов, например, приведение временных меток к началу часа:

Пример sql
SELECT 
    EventDateTime,
    DATEADD(HOUR, FLOOR(DATEDIFF(HOUR, '2000-01-01', EventDateTime) / 1.0), '2000-01-01') AS HourStart
FROM Events;

Эмуляция функции TRUNCATE для положительных чисел путем комбинации с другими функциями:

Пример sql
SELECT 
    Number,
    FLOOR(Number) AS FloorResult,
    CASE WHEN Number >= 0 THEN FLOOR(Number) ELSE CEILING(Number) END AS TruncateEmulation
FROM NumbersTable;

Использование в вычисляемом столбце таблицы для хранения округленных значений:

Пример sql
CREATE TABLE Products (
    ProductID INT PRIMARY KEY,
    Price DECIMAL(10,2),
    PriceFloor AS FLOOR(Price) PERSISTED
);

Аналоги функции в других СУБД и языках

Функция FLOOR является стандартной для многих систем управления базами данных и языков программирования.

MySQL, PostgreSQL: синтаксис идентичен MS SQL.
Пример для MySQL:

SELECT FLOOR(15.75);
15

Oracle: функция также называется FLOOR и работает аналогично. Применяется к числам и датам (возвращает дату без времени).
Пример:

SELECT FLOOR(15.75) FROM dual;
15

SQLite: поддерживает функцию FLOOR через модуль math. В стандартной поставке может потребоваться эмуляция.
JavaScript: глобальный объект Math имеет метод Math.floor().
Пример:

Math.floor(4.9);
4

Python: функция floor() находится в модуле math.
Пример:

import math
math.floor(3.7)
3

Основное отличие между реализациями часто связано с поддержкой типов данных и обработкой особых значений, таких как NULL или бесконечность, но базовое поведение для числовых аргументов единообразно.

MS SQL FLOOR function comments

En
FLOOR Returns the largest integer less than or equal to the specified numeric expression