我通过Ruby宝石“续集”使用PostgreSQL。

我要四舍五入到小数点后两位。

这是我的代码:

SELECT ROUND(AVG(some_column),2)    
FROM table

我得到以下错误:

PG::Error: ERROR:  function round(double precision, integer) does 
not exist (Sequel::DatabaseError)

当我运行以下代码时,我没有得到错误:

SELECT ROUND(AVG(some_column))
FROM table

有人知道我哪里做错了吗?


当前回答

PostgreSQL没有定义圆(双精度,整数)。出于某些原因,“猫回忆”的@Mike Sherrill在评论中解释说,需要精度的round版本只适用于数字。

regress=> SELECT round( float8 '3.1415927', 2 );
ERROR:  function round(double precision, integer) does not exist

regress=> \df *round*
                           List of functions
   Schema   |  Name  | Result data type | Argument data types |  Type  
------------+--------+------------------+---------------------+--------
 pg_catalog | dround | double precision | double precision    | normal
 pg_catalog | round  | double precision | double precision    | normal
 pg_catalog | round  | numeric          | numeric             | normal
 pg_catalog | round  | numeric          | numeric, integer    | normal
(4 rows)

regress=> SELECT round( CAST(float8 '3.1415927' as numeric), 2);
 round 
-------
  3.14
(1 row)

(在上面,请注意float8只是双精度的缩写别名。你可以看到PostgreSQL在输出中扩展了它)。

要使用round的双参数形式,必须将要舍入为数值的值强制转换。只需将::numeric附加为简化强制转换,如round(val::numeric,2)。


如果您正在格式化显示给用户,不要使用四舍五入。使用to_char(参见:手册中的数据类型格式化函数),它允许您指定一种格式,并为您提供不受客户端语言可能对数值所做的任何奇怪操作影响的文本结果。例如:

regress=> SELECT to_char(float8 '3.1415927', 'FM999999999.00');
    to_char    
---------------
 3.14
(1 row)

To_char会将数字四舍五入作为格式化的一部分。FM前缀告诉to_char不需要任何前导空格的填充。

其他回答

试试这个:

SELECT to_char (2/3::float, 'FM999999990.00');
-- RESULT: 0.67

或者仅仅是:

SELECT round (2/3::DECIMAL, 2)::TEXT
-- RESULT: 0.67

PostgreSQL没有定义圆(双精度,整数)。出于某些原因,“猫回忆”的@Mike Sherrill在评论中解释说,需要精度的round版本只适用于数字。

regress=> SELECT round( float8 '3.1415927', 2 );
ERROR:  function round(double precision, integer) does not exist

regress=> \df *round*
                           List of functions
   Schema   |  Name  | Result data type | Argument data types |  Type  
------------+--------+------------------+---------------------+--------
 pg_catalog | dround | double precision | double precision    | normal
 pg_catalog | round  | double precision | double precision    | normal
 pg_catalog | round  | numeric          | numeric             | normal
 pg_catalog | round  | numeric          | numeric, integer    | normal
(4 rows)

regress=> SELECT round( CAST(float8 '3.1415927' as numeric), 2);
 round 
-------
  3.14
(1 row)

(在上面,请注意float8只是双精度的缩写别名。你可以看到PostgreSQL在输出中扩展了它)。

要使用round的双参数形式,必须将要舍入为数值的值强制转换。只需将::numeric附加为简化强制转换,如round(val::numeric,2)。


如果您正在格式化显示给用户,不要使用四舍五入。使用to_char(参见:手册中的数据类型格式化函数),它允许您指定一种格式,并为您提供不受客户端语言可能对数值所做的任何奇怪操作影响的文本结果。例如:

regress=> SELECT to_char(float8 '3.1415927', 'FM999999999.00');
    to_char    
---------------
 3.14
(1 row)

To_char会将数字四舍五入作为格式化的一部分。FM前缀告诉to_char不需要任何前导空格的填充。

SELECT ROUND(SUM(amount)::numeric, 2) AS total_amount
FROM transactions

为:200234.08

根据Bryan的回答,您可以这样做来限制查询中的小数。我把km/h转换成m/s,然后用动态图表示,但是用动态图表示的时候看起来很奇怪。在查询中进行计算时看起来很好。这是在postgresql 9.5.1上。

select date,(wind_speed/3.6)::numeric(7,1) from readings;

试着把你的列转换成一个数字:

SELECT ROUND(cast(some_column as numeric),2) FROM table