floor返回≤x的最大整数、ceiling返回≥x的最小整数,二者在mysql/postgresql中负数行为一致:floor(-2.1)=-3,ceiling(-2.1)=-2;sql server用ceiling,sqlite需扩展支持,不可用cast模拟替代。

FLOOR 和 CEILING 函数在 MySQL/PostgreSQL 中的行为差异
FLOOR 向下取整,CEILING(或 CEIL)向上取整,但不同数据库对负数的处理一致,可放心使用。MySQL 和 PostgreSQL 都支持 FLOOR(x) 和 CEILING(x),SQL Server 用 CEILING,SQLite 则需 CAST(x AS INTEGER) 模拟——但注意它会截断而非真正向上取整。
常见错误是误以为 FLOOR(-2.7) 得到 -3 是“错的”,其实这是标准定义:向下取整即“不大于 x 的最大整数”,所以 -3 CEILING(-2.7) 是 -2,不是 -3。
-
FLOOR(3.9)→ 3,CEILING(3.9)→ 4 -
FLOOR(-1.1)→ -2,CEILING(-1.1)→ -1 - PostgreSQL 中
CEIL是CEILING的别名,二者完全等价 - SQL Server 不支持
CEILING的小写形式,必须用CEILING()
在 GROUP BY 或聚合中用 FLOOR 实现分段统计
比如按价格每 50 元一段做分组统计,不能直接 GROUP BY price / 50,因为结果是浮点,会导致同一段内出现多个小数分组。正确做法是先 FLOOR(price / 50.0) 转为整数段号,再乘回边界值用于展示。
SELECT FLOOR(price / 50.0) * 50 AS price_range_start, (FLOOR(price / 50.0) + 1) * 50 AS price_range_end, COUNT(*) AS cnt FROM products GROUP BY FLOOR(price / 50.0);
注意除数写成 50.0 而非 50:避免整数除法(如 PostgreSQL 中 99 / 50 得 1),确保得到浮点结果供 FLOOR 正确处理。
- 若用
ROUND(price / 50, 0)代替,会四舍五入,不符合“向下分段”需求 -
FLOOR(price / 50.0) * 50比TRUNCATE(price, -2)更通用,不依赖十进制位数 - 该模式也适用于时间分桶,例如
FLOOR(EXTRACT(EPOCH FROM ts) / 3600)按小时分组
CEILING 配合 CASE 处理“至少分配 N 单位”的业务逻辑
库存系统中常需计算“最少需要多少个容量为 12 的箱子装下 35 件货”,即 CEILING(35.0 / 12) = 3。但若输入是整数列且数据库不自动转浮点(如 SQLite),直接写 CEILING(items / 12) 会因整除得 2(35/12=2),结果错误。
安全写法是显式转浮点或加 .0:
SELECT item_count, CEILING(item_count * 1.0 / 12) AS box_needed FROM orders;
- SQL Server 中
CEILING(35/12)仍得 2,因35/12先算整除 → 2,再CEILING(2)→ 2 - 更健壮的写法:
CEILING(CAST(item_count AS FLOAT) / 12) - 某些场景需“向上取整但最小为 1”,可套
GREATEST(1, CEILING(...))
性能与 NULL 值的隐含陷阱
FLOOR 和 CEILING 本身开销极小,但若在 WHERE 或 JOIN 条件中对字段应用它们(如 WHERE FLOOR(value) = 5),会阻止索引使用——因为函数改变了原始列值,数据库无法直接匹配 B-tree 索引项。
NULL 值传入时,两个函数均返回 NULL,不会报错,但可能引发后续逻辑空值扩散。例如:COALESCE(CEILING(rating), 0) 可兜底,但要注意 0 是否符合业务语义(比如评分 0 和“无评分”含义不同)。
- 想走索引?改写为范围查询:
WHERE value >= 5 AND value 替代 <code>FLOOR(value) = 5 - PostgreSQL 中可用函数索引缓解:
CREATE INDEX idx_floor_value ON t (FLOOR(value));,但增加维护成本 - MySQL 8.0+ 支持函数索引,语法类似,但需确认版本和存储引擎是否支持
实际用时最易忽略的是除法类型和 NULL 传播路径——一个没写 .0 或漏掉 COALESCE,线上就可能多出几百个空箱或少算半格库存。











