Estoy usando PostgreSQL a través de la 'secuela' de Ruby gem.
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?
sql
ruby
postgresql
sequel
usuario1626730
fuente
fuente
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
Respuestas:
PostgreSQL no define
round(double precision, integer)
. Por razones que @Mike Sherrill 'Cat Recall' explica en los comentarios, la versión de ronda que requiere precisión solo está disponible paranumeric
.(En lo anterior, tenga en cuenta que
float8
es solo un alias abreviado paradouble precision
. Puede ver que PostgreSQL lo está expandiendo en la salida).Debe convertir el valor a redondear
numeric
para usar la forma de dos argumentos deround
. Solo agrega::numeric
el elenco de taquigrafía, comoround(val::numeric,2)
.Si está formateando para mostrar al usuario, no lo use
round
. Useto_char
(vea: funciones de formato de tipo de datos en el manual), que le permite especificar un formato y le da untext
resultado que no se ve afectado por cualquier rareza que el idioma de su cliente pueda hacer con losnumeric
valores. Por ejemplo:to_char
redondeará los números para usted como parte del formateo. ElFM
prefijo diceto_char
que no desea ningún relleno con espacios iniciales.fuente
ROUND(CAST(FLOAT8 '3.1415927' AS NUMERIC),2);
, obtengo '0.314E1'. Y todavía tengo mi código escrito,ROUND(AVG(val),2)
todavía recibo el error que describí en mi pregunta.ROUND(CAST(FLOAT8 '3.1415927' AS NUMERIC),2);
en PgAdmin y Ruby. Con PgAdmin, obtengo 3.14, pero con Ruby (usando la gema Sequel) obtengo '0.314E1'. Me pregunto por qué esto es ...double
versión deround
tendría que regresarnumeric
o (ugh)text
, por lo que también podría tomar unanumeric
discusión.Pruebe también la antigua sintaxis para emitir,
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 están de acuerdo sobre la "razón 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 sobrecargar la función REDONDA con,
Ahora su instrucción funcionará bien, intente (después de la creación de la función)
pero devuelve un tipo NUMÉRICO ... Para preservar la primera sobrecarga de uso común, podemos devolver un tipo FLOAT cuando se ofrece un parámetro TEXT,
Tratar
PD: comprobar
\df round
después de sobrecargas, mostrará algo como,Las
pg_catalog
funciones son las predeterminadas, consulte el manual de funciones matemáticas integradas .fuente
Prueba con esto:
O simplemente:
fuente
puedes usar la siguiente función
el resultado mostrará:
También puede lanzar su variable al tipo de deseo:
fuente
Según la respuesta de Bryan, puede hacer esto para limitar los decimales en una consulta. Convierto de km / ha m / s y lo muestro en gráficos, pero cuando lo hice en gráficos me pareció extraño. Se ve bien al hacer el cálculo en la consulta. Esto está en postgresql 9.5.1.
fuente
Intente convertir su columna a un valor numérico como:
fuente
Solución : necesita agregar un tipo de molde, entonces funcionará
Ex:
round(extract(second from job_end_time_t)::integer,0)
fuente
seleccione ROUND (SUM (cantidad) :: numérico, 2) como total_amount de las transacciones
da: 200234.08
fuente