我在 PostgreSQL 中看起来类似我可以在 Excel 中使用 FLOOR 函数做的事情。
例如:
=FLOOR(199999;100000)
会给我 100 000
我在 pgsql 中尝试过:
SELECT round(199999 ,-5)
但这会将数字向上取整 -> 200000。
答案 0 :(得分:2)
round()
总是向下舍入 0-4 和向上舍入 5-9,因此您无法使用此方法实现最低舍入。
这将是实现它的方式。
SELECT
floor(199999 / 100000) * 100000
等于
SELECT
floor(199999 / pow(10,5)) * pow(10,5)
这样你就可以编写自己的函数了:
CREATE OR REPLACE FUNCTION floor_precision(_value int, _precision int)
RETURNS integer AS $$
DECLARE
rounded integer;
BEGIN
SELECT floor(_value / pow(10, _precision)) * pow(10, _precision)
INTO rounded;
RETURN rounded;
END;
$$ LANGUAGE plpgsql;
SELECT floor_precision(199999, 5)
或者,您可以使用带有第二个参数的 round()
函数:
SELECT
round(199999 - 50000, -5)
等于
SELECT
round(199999 - (pow(10,5) / 2)::int, -5)
当然,您也可以在这里创建自己的函数:
CREATE OR REPLACE FUNCTION floor_precision(_value int, _precision int)
RETURNS integer AS $$
DECLARE
rounded integer;
BEGIN
SELECT round(_value - (pow(10, _precision) / 2)::int, _precision * -1)
INTO rounded;
RETURN rounded;
END;
$$ LANGUAGE plpgsql;
SELECT floor_precision(199999, 5)
根据 fiddle 的执行计划,第二个变体似乎要快得多。
答案 1 :(得分:0)
好函数,但可以更进一步,创建一个 SQL 函数。
create or replace
function floor_precision(_value int, _precision int)
returns integer
language sql
immutable strict
as $$
select round(_value - (pow(10, _precision) / 2)::int, _precision * -1)::int;
$$;