truncar - sql server float 2 decimales
¿Cómo redondear un promedio de 2 decimales en PostgreSQL? (5)
Error: la función redonda (precisión doble, número entero) no existe
Solución : necesitas agregar yeso, entonces funcionará
Ej: round(extract(second from job_end_time_t)::integer,0)
Estoy usando PostgreSQL a través de Ruby gem ''secuela''.
Estoy tratando de redondear a dos decimales.
Aquí está mi código:
SELECT ROUND(AVG(some_column),2)
FROM table
Obtuve el siguiente error:
PG::Error: ERROR: function round(double precision, integer) does
not exist (Sequel::DatabaseError)
No obtengo ningún error cuando ejecuto el siguiente código:
SELECT ROUND(AVG(some_column))
FROM table
¿Alguien sabe lo que estoy haciendo mal?
PostgreSQL no define round(double precision, integer)
. Por razones @Catcall explica en los comentarios, la versión de la ronda que requiere precisión solo está disponible para numeric
.
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)
(En lo anterior, tenga en cuenta que float8
es solo un alias abreviado para double precision
. Puede ver que PostgreSQL lo está expandiendo en la salida).
Debe convertir el valor redondeado a numeric
para usar la forma de round
de dos argumentos. Simplemente agregue ::numeric
para el molde de taquigrafía, como round(val::numeric,2)
.
Si está formateando para mostrar al usuario, no use round
. Use to_char
(consulte: funciones de formateo del tipo de datos en el manual), que le permite especificar un formato y le proporciona un resultado de text
que no se ve afectado por las rarezas que pueda causar el idioma de su cliente con numeric
valores numeric
. Por ejemplo:
regress=> SELECT to_char(float8 ''3.1415927'', ''FM999999999.00'');
to_char
---------------
3.14
(1 row)
to_char
redondeará números para ti como parte del formateo. El prefijo FM
le dice to_char
que no quiere ningún relleno con espacios to_char
.
Prueba con esto:
SELECT to_char (2/3::float, ''FM999999990.00'');
-- RESULT: 0.67
O simplemente:
SELECT round (2/3::DECIMAL, 2)::TEXT
-- RESULT: 0.67
Pruebe también la vieja sintaxis para el casting,
SELECT ROUND(AVG(some_column)::numeric,2)
FROM table;
funciona con cualquier versión de PostgreSQL.
Hay una falta de sobrecargas en algunas funciones de PostgreSQL, ¿por qué (???): creo que "es una falta" (!), Pero @CraigRinger, @Catcall y el equipo de PostgreSQL coinciden en "la lógica histórica de pg".
PD: otro punto sobre el redondeo es la precisión , verifique la respuesta de IanKenney .
Sobrecarga como estrategia de lanzamiento
Puede overload la función REDONDO con,
CREATE FUNCTION ROUND(float,int) RETURNS NUMERIC AS $$
SELECT ROUND($1::numeric,$2);
$$ language SQL IMMUTABLE;
Ahora su instrucción funciona bien, intente (después de la creación de la función)
SELECT round(1/3.,4); -- 0.3333 numeric
pero devuelve un tipo NUMERIC ... Para conservar la primera sobrecarga de uso común, podemos devolver un tipo FLOAT cuando se ofrece un parámetro TEXT,
CREATE FUNCTION ROUND(float, text, int DEFAULT 0)
RETURNS FLOAT AS $$
SELECT CASE WHEN $2=''dec''
THEN ROUND($1::numeric,$3)::float
-- ... WHEN $2=''hex'' THEN ... WHEN $2=''bin'' THEN... complete!
ELSE ''NaN''::float -- like an error message
END;
$$ language SQL IMMUTABLE;
Tratar
SELECT round(1/3.,''dec'',4); -- 0.3333 float!
SELECT round(2.8+1/3.,''dec'',1); -- 3.1 float!
SELECT round(2.8+1/3.,''dec''::text); -- need to cast string? pg bug
PD: comprobar /df round
después de las sobrecargas, mostrará algo así como,
Schema | Name | Result data type | Argument data types ------------+-------+------------------+---------------------------- myschema | round | double precision | double precision, text, int myschema | round | numeric | double precision, int pg_catalog | round | double precision | double precision pg_catalog | round | numeric | numeric pg_catalog | round | numeric | numeric, int
Las funciones pg_catalog
son las predeterminadas, consulte el manual de las funciones matemáticas integradas .
Según Bryan''s respuesta Bryan''s puedes hacer esto para limitar los decimales en una consulta. Convierto de km / h a m / s y lo visualizo en dygraphs pero cuando lo hice en dygraphs me pareció raro. Se ve bien al hacer el cálculo en la consulta en su lugar. Esto está en postgresql 9.5.1.
select date,(wind_speed/3.6)::numeric(7,1) from readings;