floor函数返回小于或等于指定数值的最大整数,不四舍五入;如floor(3.9)=3、floor(-2.1)=-3;主流数据库均支持floor(expression),常用于向下取整、分页分组及保守估算场景。

SQL中FLOOR函数的基本用法
FLOOR函数直接返回小于或等于指定数值的最大整数,它不四舍五入、不向上取整,就是纯粹“砍掉小数部分向下找整数”。比如 FLOOR(3.9) 得到 3,FLOOR(-2.1) 得到 -3(注意负数!)。
所有主流数据库(MySQL、PostgreSQL、SQL Server、Oracle)都支持 FLOOR,语法统一:FLOOR(expression),其中 expression 可以是列名、计算式或常量。
常见错误:把 FLOOR 当成 ROUND 或 CEILING 用,结果发现负数行为不符合预期——这是最常被忽略的点。
在SELECT中对数值列向下取整
直接在 SELECT 子句里套用 FLOOR 即可,适用于价格、评分、统计计数等需要“保守估算”的场景。
SELECT product_name, FLOOR(price) AS floor_price FROM products;- 如果
price是 DECIMAL(10,2),FLOOR(price)返回的是整数类型(具体类型依数据库而定,MySQL 返回 BIGINT,PostgreSQL 返回 NUMERIC) - 若需保持小数位显示(如显示为
29.00),得配合CAST或ROUND再格式化,FLOOR本身不保留小数位
FLOOR配合除法实现分页/分组编号
当需要按固定大小分组并编号(比如每5条记录为一组,组号从0开始),FLOOR 比整数除法更可靠,尤其在有负数或数据库对 / 运算符处理不一致时。
示例:给订单按创建时间排序后,每10条划为一页,生成页码索引:
SELECT order_id, created_at,
FLOOR((ROW_NUMBER() OVER (ORDER BY created_at) - 1) / 10) AS page_index
FROM orders;
这里必须减1再除,否则第1–10条会算成第1页(结果为0–9 → FLOOR(0~0.9)=0),而不是错误地变成1–10(不减1则第1条就是 FLOOR(1/10)=0,但第10条是 FLOOR(10/10)=1,跨页了)。
和ROUND、TRUNCATE、CEILING的区别与选型提示
别只记住 FLOOR,得清楚它在哪种场景不可替代:
-
ROUND(x, 0)是四舍五入,ROUND(2.5, 0)→ 3,FLOOR(2.5)→ 2 -
TRUNCATE(x, 0)(MySQL)或TRUNC(x)(PostgreSQL/Oracle)是截断小数,对正数效果同FLOOR,但对负数不同:TRUNC(-2.7)→ -2,而FLOOR(-2.7)→ -3 -
CEILING(x)是向上取整,和FLOOR行为相反,别混用 - 性能上无差异,三者都是标量函数,但语义错位会导致业务逻辑出错,比如库存预警用错函数可能少触发一次告警
负数处理逻辑是实际开发中最容易漏测的一环,上线前务必用 -0.5、-1.0、-5.9 这类值验证结果。











