在SQL的各类业务查询场景中,数值取整是非常常见的需求,比如计算商品分批次发货的批次数量需要向上取整,统计用户平均消费金额保留整数部分需要向下取整,CEILING和FLOOR函数是SQL中专门用于处理这两类取整需求的内置函数,几乎所有主流关系型数据库都支持这两个函数的基础用法。

CEILING函数:实现向上取整
CEILING函数的作用是返回大于或等于指定数值的最小整数,也就是我们常说的向上取整,只要数值存在小数部分,无论小数部分是多少,都会进一位到下一个整数。
基础语法
CEILING函数的语法非常简单,只需要传入一个数值类型的参数即可:
-- 语法格式 CEILING(numeric_expression) -- numeric_expression可以是具体的数字、列名或者计算表达式
使用示例
我们可以通过具体的查询示例来看CEILING函数的效果,以下是在MySQL中执行的测试代码:
-- 直接对具体数值向上取整 SELECT CEILING(3.1) AS result1, CEILING(5.9) AS result2, CEILING(-2.3) AS result3; -- 对表中列的计算结果向上取整,假设orders表有total_price列存储订单总价 SELECT order_id, total_price, CEILING(total_price / 10) AS batch_count FROM orders;
第一个查询的结果分别是4、6、-2,第二个查询会计算每个订单总价除以10后的向上取整结果,代表每个订单需要分多少批次处理,每批次处理10元。
FLOOR函数:实现向下取整
FLOOR函数的作用和CEILING相反,它返回小于或等于指定数值的最大整数,也就是向下取整,无论小数部分是多少,都会直接舍弃。
基础语法
FLOOR函数的语法和CEILING完全一致:
-- 语法格式 FLOOR(numeric_expression) -- 参数要求和CEILING函数相同
使用示例
同样通过示例来看FLOOR函数的实际效果:
-- 直接对具体数值向下取整 SELECT FLOOR(3.1) AS result1, FLOOR(5.9) AS result2, FLOOR(-2.3) AS result3; -- 对表中列的计算结果向下取整,假设users表有score列存储用户得分 SELECT user_id, score, FLOOR(score / 10) AS level FROM users;
第一个查询的结果分别是3、5、-3,第二个查询会计算每个用户得分除以10后的向下取整结果,用来划分用户的等级区间。
两个函数的注意事项
- 两个函数的参数都必须是数值类型,如果传入字符串类型会先尝试隐式转换为数值,转换失败则会报错。
- 不同数据库对负数的取整逻辑是一致的,CEILING处理负数时结果会比原数大,FLOOR处理负数时结果会比原数小。
- 如果传入的参数本身就是整数,两个函数都会直接返回原数值,不会做任何处理。
- 部分数据库还支持ROUND函数用于四舍五入取整,和CEILING、FLOOR的取整逻辑不同,使用时需要注意区分。
常见业务场景示例
假设我们有一个商品表products,包含product_id、price、stock三个字段,需要查询每个商品按每箱12件计算需要多少个箱子,以及每个商品去掉小数部分后的整数库存:
SELECT
product_id,
stock,
CEILING(stock / 12) AS box_count, -- 向上取整计算箱子数
FLOOR(stock * price) AS total_int_value -- 向下取整计算总金额整数部分
FROM products;
这个查询会同时返回向上取整和向下取整的结果,满足不同的业务统计需求。