CEIL与CEILING功能完全相同,均为向上取整(返回≥输入值的最小整数),MySQL、PostgreSQL、Oracle均支持二者,SQL Server仅支持CEILING;跨平台推荐用CEILING以确保兼容性。

CEIL 和 CEILING 在各数据库中是否都可用
MySQL、PostgreSQL、Oracle、SQL Server(2017+)都支持 CEILING,但 CEIL 并非全平台兼容:MySQL 和 PostgreSQL 支持 CEIL 作为别名,Oracle 也支持,而 SQL Server 只认 CEILING,用 CEIL 会报错 Invalid column name 'CEIL'。
实际写跨库 SQL 时,优先选 CEILING 更稳妥;若只跑 MySQL 或 PG,CEIL 更简洁。
CEILING 函数对负数的处理逻辑
很多人误以为 CEILING 就是“四舍五入到正方向”,其实它是“向正无穷取整”——即返回 ≥ 输入值的最小整数。这意味着负数行为和直觉相反:
-
CEILING(3.2)→ 4 -
CEILING(-3.2)→ -3(不是 -4) -
CEILING(-5.0)→ -5
如果业务需要“向下取整的绝对值向上”,比如计算退款扣款按整元进一,得先转正再处理,不能直接套用 CEILING。
在聚合或表达式中使用 CEILING 的注意事项
CEILING 接收数值型参数,传入字符串或 NULL 会触发隐式转换或报错:
- MySQL 中
CEILING('4.7')能运行,但会先截断为4再取整(结果仍是 4) - PostgreSQL 严格要求类型匹配,
CEILING('4.7')直接报错function ceiling(text) does not exist - 遇到 NULL 时,所有数据库都返回 NULL,不报错,但可能影响后续判断逻辑
建议显式转换:用 CEILING(CAST(price AS DECIMAL(10,2))) 替代裸字段,尤其当源字段是 VARCHAR 存金额时。
替代方案:没有 CEILING 时怎么模拟向上取整
老版本 SQL Server(2016 及更早)不支持 CEILING,可用 ROUND + 条件逻辑模拟:
SELECT CASE WHEN x = FLOOR(x) THEN x ELSE FLOOR(x) + 1 END AS ceiling_x FROM (VALUES (3.1), (5.0), (-2.9)) t(x);
注意:该写法对负零、浮点精度误差敏感;若数据含大量小数,FLOOR(x) + 1 比 ROUND(x, 0, 1) 更可靠——后者在 SQL Server 中第三个参数为 1 表示“截断”,不是向上取整。
真正容易被忽略的是边界场景:比如 CEILING(1e-15) 在某些数据库里可能因浮点表示误差变成 0,而不是 1。涉及金融计算时,务必先转成 DECIMAL 再取整。










