SQLite中的CEIL和FLOOR函数

9

SQLite中,找到一个数字的上限下限的最干净的方法是什么?不幸的是,ROUND()函数是SQLite唯一提供的函数。

3个回答

12

公式

Ceil(向上取整):cast(x as int) + (x > cast(x as int))
取x的整数部分,如果小数部分大于0,则加1。

Floor(向下取整):cast(x as int) - (x < cast(x as int))
取x的整数部分,如果小数部分小于0,则减1。


示例

Ceil:
SELECT (cast(amount as int) + (amount > cast(amount as int))) AS amount FROM SALES WHERE id = 128;

Floor:
SELECT (cast(amount as int) - (amount < cast(amount as int))) AS amount FROM SALES WHERE id = 128;



我已经使用MySQL的ceil()和floor()函数检查了所有包括负数在内的边界情况。

测试结果


1
有趣,谢谢。根据文档(https://www.sqlite.org/lang_expr.html),它似乎不能与Xerial一起使用,也不应该这样做:“运算符%输出其左操作数模其右操作数的整数值”。 - Lukas Eder
@LukasEder 非常感谢您的评论。出现了一个大错误。它是从MySQL中复制而来,而不是SQLite。请查看已更正的版本。 - Bertram Gilfoyle
需要注意的一件事是,数字(“amount”或“x”)必须是REAL类型。我从数据库中获取了一个月份,并将其除以3得到季度。在SQLite中,使用两个整数操作数进行除法运算会得到一个整数。因此,当月份为2时,它会计算为0 + (0 > 0),因此返回0而不是1。 - Alien426

9
您可以使用ROUND()来实现类似于CEILFLOOR的效果,只需将手头数字加上或减去0.5即可。我更喜欢这种方法,因为它更易读。
对Anees的示例进行拓展: Ceil:SELECT ROUND(amount+0.5, 0) AS amount FROM SALES WHERE id = 128;
Floor:SELECT ROUND(amount-0.5, 0) AS amount FROM SALES WHERE id = 128; 感谢Anees在下面的评论中提供的建议,我也没有考虑到那个边角情况。他的解决方案更加健壮。

2
哇!我没想到这个。但是请注意,它并不总是有效的。例如,CEIL(1) = 1ROUND(1+0.5, 0) = 2。虽然如果值不是整数会更好。 - Bertram Gilfoyle
2
对于大于等于0的实数,使用Ceil和Floor函数时,请尝试使用0.4999999999而不是0.5。 - Clint Pachl

2

请参考 https://www.sqlite.org/lang_mathfunc.html#ceil

显然,SQLite 提供了向上取整的功能:

ceil(X)
ceiling(X)

返回大于或等于X的第一个可表示整数值。 对于X的正值,此例程向远离零四舍五入。对于X的负值,此例程向零四舍五入。

但是,遗憾的是,默认情况下它没有被编译 - 只有在使用-DSQLITE_ENABLE_MATH_FUNCTIONS编译时才会激活。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接