ceil与ceiling功能完全等价,均返回≥输入值的最小整数;mysql、postgresql、oracle支持二者,sql server仅支持ceiling,跨平台推荐用ceiling确保兼容性。

CEIL 和 CEILING 在 SQL 中完全等价,选哪个都行
MySQL、PostgreSQL、Oracle、SQL Server(2022+)和 SQLite 都支持 CEIL 和 CEILING,二者行为完全一致,没有精度或类型处理差异。不是所有数据库都同时暴露两个名字——比如 MySQL 只认 CEIL(CEILING 会报错),而 SQL Server 早期版本只认 CEILING。所以别纠结语义,直接查你用的数据库文档确认支持哪个函数名。
CEIL 返回的是数值类型,不是整数类型
很多人以为 CEIL(3.1) 返回 4(整型),实际它返回的是和输入相同精度的数值类型:比如输入是 DECIMAL(5,2),输出仍是 DECIMAL(5,2),值为 4.00;输入是 FLOAT,输出也是 FLOAT。这会影响后续比较或聚合:
- 如果要强制转成整数,得显式加
CAST(CEIL(x) AS INTEGER)或TRUNC(CEIL(x))(取决于数据库) - 在 GROUP BY 或 JOIN 中,
CEIL(3.0)和3可能因类型不同无法自动匹配(尤其当一边是整型列,一边是浮点运算结果时) - 某些数据库(如旧版 Hive)对
CEIL输入为NULL时返回NULL,但若输入是字符串且隐式转数字失败,会直接报错,不是静默返回NULL
负数的向上取整容易理解错
“向上”是指向数轴正方向,不是“往大了取”。所以 CEIL(-2.7) 是 -2,不是 -3。这点和 Python 的 math.ceil() 一致,但和很多业务直觉相反。常见误用场景:
- 计算折扣后最低收费金额:假设费用是
-19.3元(表示退款),用CEIL得到-19,但业务可能想要“绝对值向上取整”即-20,这时得写-FLOOR(ABS(x)) - 分页计算总页数时,若每页 10 条,共 -15 条数据(逻辑异常),
CEIL(-15/10.0)=-1,显然不合理——得先校验输入有效性,不能依赖CEIL做逻辑兜底
替代方案:没有 CEIL 函数的老数据库怎么办
像旧版 SQL Server(2016 之前)、某些嵌入式数据库不支持 CEIL。可用表达式模拟,但要注意边界:
-
SELECT CASE WHEN x = FLOOR(x) THEN x ELSE FLOOR(x) + 1 END—— 对正数可靠,但对负数失效(如x = -2.0会被错误加 1) - 更通用写法:
SELECT -FLOOR(-x),这个恒等价于CEIL(x),适用于所有支持FLOOR的数据库,包括负数、零、正数 - 注意:如果
x是NULL,上述表达式仍返回NULL,无需额外处理;但如果x是字符串,必须先CAST,否则-FLOOR(-'3.2')在多数数据库里会直接报类型错误
SELECT CEIL(1.1), CEIL(-1.1) 跑通没,再决定要不要 fallback 到 -FLOOR(-x)。边界情况比想象中多,尤其是涉及货币计算或分页总数时,负数和零的处理经常被忽略。










