在SQL的各类数据处理场景中,数值取整是高频需求,floor和ceil是两个专门用于数值取整的内置函数,二者处理逻辑不同,适配不同的业务场景,掌握它们的用法能大幅提升数据处理的效率。

floor和ceil函数的基础语法
floor函数的作用是向下取整,即返回小于等于输入数值的最大整数;ceil函数的作用是向上取整,即返回大于等于输入数值的最小整数。两个函数的语法非常简洁,参数均为一个数值类型的表达式,支持整数、小数、浮点型等常见数值类型。
以MySQL数据库为例,基础调用方式如下:
-- floor函数语法 FLOOR(数值表达式) -- ceil函数语法 CEIL(数值表达式) -- 也可以使用CEILING,是CEIL的同义词 CEILING(数值表达式)
基础用法示例
下面通过具体的数值案例展示两个函数的处理结果差异,测试数值包含正数、负数、整数三类:
SELECT
FLOOR(3.2) AS floor_positive, -- 结果:3
CEIL(3.2) AS ceil_positive, -- 结果:4
FLOOR(-3.2) AS floor_negative, -- 结果:-4
CEIL(-3.2) AS ceil_negative, -- 结果:-3
FLOOR(5) AS floor_integer, -- 结果:5
CEIL(5) AS ceil_integer -- 结果:5
FROM dual;
从结果可以看出,当输入为整数时,两个函数的返回值都等于原整数;正数的取整逻辑符合常规的上下取整认知,负数的取整需要注意,floor会取到更小的负整数,ceil会取到更大的负整数。
实际业务中的实用技巧
1. 分页场景计算总页数
在分页查询时,通常需要根据总数据量和每页条数计算总页数,此时就需要用到ceil函数。假设总数据量为total_count,每页展示page_size条数据,总页数公式为:
-- 计算总页数
SELECT CEIL(total_count / page_size) AS total_page
FROM (
SELECT COUNT(*) AS total_count
FROM user_table -- 用户表,替换为实际业务表名
) t;
比如总数据量为101条,每页展示10条,101/10=10.1,ceil处理后得到11,符合总页数的实际计算结果。
2. 金额向下取整分摊场景
在金额分摊、优惠券抵扣等场景中,经常需要向下取整避免金额溢出,比如将100元优惠券平均分摊给3个订单,每个订单最多抵扣的金额需要用floor计算:
-- 计算每个订单最多抵扣的优惠券金额,单位:分 SELECT FLOOR(10000 / 3) AS per_order_deduct; -- 10000分=100元,结果:3333,即33.33元
3. 时间维度取整统计
如果需要对时间戳按小时、天等维度做向下取整统计,比如统计每个整点小时的订单量,可以结合floor和时间函数使用:
-- 按小时向下取整统计订单量
SELECT
FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP(order_time) / 3600) * 3600) AS hour_start,
COUNT(*) AS order_count
FROM order_table -- 订单表,替换为实际业务表名
GROUP BY hour_start;
注意事项
- 不同数据库对这两个函数的支持基本一致,但部分数据库ceil函数的写法可能有差异,比如Oracle中支持CEIL和CEILING,SQL Server中仅支持CEILING。
- 如果输入参数为NULL,两个函数的返回值均为NULL,使用时需要先做空值处理,避免统计结果异常。
- 处理负数的取整时,要仔细核对业务需求,避免把floor和ceil的逻辑弄反,导致结果不符合预期。
需要注意的是,floor和ceil仅做取整处理,不会进行四舍五入,如果需要四舍五入取整,应该使用ROUND函数,三个函数的适用场景有明显区分,不要混淆使用。