FLOOR函数是SQL中向下取整的标准方法,返回不大于给定数值的最大整数,正数舍小数(如FLOOR(3.9)=3),负数向更小整数取(如FLOOR(-2.1)=-3),跨数据库行为一致但需注意类型转换与NULL处理。

FLOOR 函数是 SQL 中最直接、最可靠的向下取整方式,适用于所有主流数据库(MySQL、PostgreSQL、SQL Server、Oracle),且行为一致。
什么是“向下取整”?FLOOR 和 ROUND/CEILING 的关键区别
向下取整指“向负无穷方向舍入”,即取不大于原数的最大整数。例如:FLOOR(3.9) → 3,FLOOR(-2.1) → -3(不是 -2)。这和 ROUND(x, 0)(四舍五入)或 CEILING(x)(向上取整)有本质区别。很多人误用 ROUND 替代 FLOOR,结果在负数场景出错。
-
FLOOR(5.0)→ 5 -
FLOOR(4.999)→ 4 -
FLOOR(-1.001)→ -2(注意:不是 -1) -
FLOOR(-7)→ -7
不同数据库中 FLOOR 的使用注意事项
FLOOR 本身跨平台兼容性极好,但参数类型和返回类型略有差异,容易引发隐式转换问题。
- 输入为浮点数(如
DECIMAL、FLOAT)时,MySQL 和 PostgreSQL 返回同精度的DECIMAL;SQL Server 默认返回INT(若输入是INT),但输入是DECIMAL(10,2)时仍返回DECIMAL(10,0) - Oracle 要求输入必须是数值型,传字符串会报错:
ORA-01722: invalid number - 如果字段可能为
NULL,FLOOR(col)结果也是NULL,需提前用COALESCE(col, 0)处理
实际业务中常见的误用场景和修复写法
常见需求如“计算满 100 元减 20 元的优惠档位”“按 30 分钟粒度向下对齐时间戳”,都依赖严格向下取整。错误做法常出现在用整数除法替代 FLOOR 或忽略数据类型。
- ❌ 错误:用
col / 100 * 100(在整数列上,某些数据库会截断小数,但行为不可靠) - ✅ 正确:用
FLOOR(col / 100.0) * 100(显式转浮点,确保除法不被整除截断) - ❌ 错误:对时间字段直接
FLOOR(created_at)(报类型错误) - ✅ 正确:先转为数值,如 PostgreSQL:
FLOOR(EXTRACT(EPOCH FROM created_at) / 1800) * 1800(转成秒后向下取整到 30 分钟) - ⚠️ 注意:MySQL 中
FLOOR对BIGINT安全,但对超大浮点数(如999999999999999999.9)可能因精度丢失导致结果偏差
真正要小心的是负数逻辑和隐式类型转换——这两处出错时,SQL 不报错,但业务结果悄悄偏离预期。

















