floor向下取整、ceiling/ceil向上取整;floor(-2.1)=-3,非-2;sqlite和oracle仅支持ceil,postgresql不认ceiling;where中使用会失效索引。

SQL中FLOOR和CEILING函数的基本行为差异
FLOOR 向下取整,返回不大于参数的最大整数;CEILING(或 CEIL,取决于数据库)向上取整,返回不小于参数的最小整数。两者都只接受数值类型参数,对 NULL 返回 NULL,且不改变原始数据类型精度(例如输入 DECIMAL(10,3),输出仍是 DECIMAL 类型,小数位被截断为 0)。
常见错误是误以为它们能四舍五入——实际不是:FLOOR(2.9) 得 2,CEILING(2.1) 得 3,但 FLOOR(-2.1) 是 -3(不是 -2),这点容易在负数场景出错。
不同数据库对CEILING函数的命名兼容性
MySQL、PostgreSQL、SQL Server 都支持 CEILING;但 SQLite 只认 CEIL,Oracle 也支持 CEIL。如果写跨库 SQL,建议优先用 CEIL(更广泛兼容),除非明确限定在 SQL Server 环境。
- MySQL:两个都可用,
CEILING(x)和CEIL(x)完全等价 - PostgreSQL:仅
CEIL(x),CEILING会报错function ceiling(numeric) does not exist - SQL Server:两者都支持,但文档推荐用
CEILING - SQLite:必须用
CEIL(x),否则提示no such function: CEILING
在SELECT中结合列计算与WHERE条件中的使用限制
FLOOR 和 CEIL 可安全用于 SELECT 列投影、ORDER BY 和 HAVING,但在 WHERE 子句中直接用于索引列时可能失效——因为函数会阻止索引使用(尤其当字段本身有 B-Tree 索引时)。
例如:WHERE FLOOR(price) = 10 无法利用 price 字段上的索引,应改写为 WHERE price >= 10 AND price (假设 price 是正数)。
其他注意事项:
- 浮点数精度问题:
FLOOR(1.3 - 1.2)在某些数据库中可能返回0或1,因0.1无法精确表示,建议先ROUND(x, 10)再取整 - 不能用于聚合函数内部再嵌套(如
FLOOR(AVG(x))是合法的,但FLOOR(SUM(COUNT(*)))语法错误) - 字符串隐式转换风险:
FLOOR('12.7')在 MySQL 中能运行,但 PostgreSQL 会报错cannot cast type text to numeric
处理金额、分页计数等典型场景的实操建议
电商中常需按“满 100 减 20”规则计算优惠档位,用 FLOOR(amount / 100) 得档位编号;而分页总页数计算(total_count / page_size 向上取整)必须用 CEIL,否则第 101 条数据会被漏掉。
示例(计算 137 条记录、每页 20 条的总页数):
SELECT CEIL(137.0 / 20) AS total_pages; -- 返回 7
注意除数必须是浮点数(如 20.0 或 CAST(20 AS DECIMAL)),否则整数除法在某些数据库(如 PostgreSQL)中会截断小数,导致 CEIL(137/20) 先算成 CEIL(6),结果仍是 6。
负数金额或温度类数据要特别小心:FLOOR(-5.2) 是 -6,不是 -5;若业务逻辑要求“向零取整”,得用 TRUNCATE 或 CAST(... AS INTEGER),而非 FLOOR。











