CEIL返回≥x的最小整数,FLOOR返回≤x的最大整数;二者均不四舍五入、不接受小数位参数,输入NULL时返回NULL,负数处理方向易误解(如CEIL(-2.3)=-2),不可用ROUND替代。

CEIL 和 FLOOR 是标准 SQL 中最直接、最可靠的向上/向下取整函数,但不同数据库对大小写、别名和 NULL 处理有细微差异,用错会返回意外结果。
CEIL 和 FLOOR 的基本行为与常见错误
两者都接受单个数值表达式(CEIL(x) 返回 ≥ x 的最小整数,FLOOR(x) 返回 ≤ x 的最大整数),但注意:
• 输入为 NULL 时,多数数据库(PostgreSQL、MySQL 8.0+、SQL Server)也返回 NULL,不报错但可能被忽略
• 某些旧版 MySQL(如 5.7)中 CEIL 可写作 CEILING,但 CEIL 更通用
• Oracle 和 PostgreSQL 区分大小写——若用双引号包裹(如 "ceil")会报错,应始终用小写或不加引号
• 不要对字符串字段直接调用,比如 CEIL("price") 在 PostgreSQL 中会报错“function ceil(text) does not exist”,需先 CAST(price AS numeric)
各数据库中的实际写法与兼容性处理
跨库迁移时,优先用标准写法,避免方言特性:
• PostgreSQL / MySQL 8.0+ / SQLite:直接用 CEIL(col) 和 FLOOR(col)
• SQL Server:用 CEILING(col)(CEIL 不支持),FLOOR(col) 可用
• Oracle:两者都支持,但要求输入为数字类型,TO_NUMBER() 常用于清洗字符串字段
• 如果需兼容 SQL Server 和其他库,可统一用 FLOOR(col) + 条件判断模拟 CEIL:
CASE WHEN col = FLOOR(col) THEN col ELSE FLOOR(col) + 1 END
和 ROUND 的关键区别:什么时候不能用 ROUND 代替
ROUND(x, 0) 看似能“取整”,但它四舍五入,不是向上或向下:
• ROUND(2.6, 0) → 3,CEIL(2.6) → 3(巧合一致)
• ROUND(-2.6, 0) → -3,但 FLOOR(-2.6) → -3,CEIL(-2.6) → -2 —— 这里 CEIL 和 ROUND 行为完全不同
• 实际业务中,计费按“向上取整”(如按天计费,哪怕只用 1 小时也算 1 天),此时必须用 CEIL,用 ROUND 会导致漏收费
• 浮点精度问题:某些数据库中 ROUND(1.5, 0) 可能因二进制表示误差变成 1 而非 2(罕见但存在),CEIL 和 FLOOR 对浮点数更稳定
带小数位的向上/向下取整(如保留 1 位小数后向上取整)
标准 SQL 不支持 CEIL(col, 1) 这类多参数语法。正确做法是缩放再还原:
• 向上取整到 0.1: CEIL(col * 10) / 10.0
• 向下取整到 0.01: FLOOR(col * 100) / 100.0
• 注意除数写成 10.0 而非 10,避免整数除法截断(尤其在 SQL Server 或旧版 MySQL 中)
• 若 col 本身是 DECIMAL(10,4) 类型,缩放后仍保持精度;但若为 FLOAT,缩放过程可能引入微小误差,建议先 ROUND(col, 6) 再处理
真正容易出问题的不是函数本身,而是没意识到输入类型是否干净、数据库是否真支持 CEIL、以及负数场景下 CEIL 和 FLOOR 的方向感是否被默认逻辑带偏。










