Korzystam z PostgreSQL poprzez „kontynuację” klejnotu Ruby.
Próbuję zaokrąglić do dwóch miejsc po przecinku.
Oto mój kod:
SELECT ROUND(AVG(some_column),2)
FROM table
Otrzymuję następujący błąd:
PG::Error: ERROR: function round(double precision, integer) does
not exist (Sequel::DatabaseError)
Po uruchomieniu następującego kodu nie pojawia się błąd:
SELECT ROUND(AVG(some_column))
FROM table
Czy ktoś wie, co robię źle?
sql
ruby
postgresql
sequel
użytkownik1626730
źródło
źródło
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
Odpowiedzi:
PostgreSQL nie definiuje
round(double precision, integer)
. Z powodów @Mike Sherrill „Cat Recall” wyjaśnia w komentarzach, wersja rundy, która wymaga precyzji, jest dostępna tylko dlanumeric
.(Powyżej zauważ, że
float8
to tylko skrótowy skrót dladouble precision
. Widać, że PostgreSQL rozwija go w wyniku).Musisz
numeric
użyć wartości, którą chcesz zaokrąglić, aby użyć dwuargumentowej postaciround
. Po prostu dołącz::numeric
do stenografii, jakround(val::numeric,2)
.Jeśli formatujesz do wyświetlania dla użytkownika, nie używaj
round
. Użyjto_char
(patrz: funkcje formatowania typu danych w instrukcji), która pozwala określić format i dajetext
wynik, na który nie ma wpływu żadna dziwność, jaką Twój klient może zrobić znumeric
wartościami. Na przykład:to_char
będzie zaokrąglać liczby w ramach formatowania.FM
Prefiks mówito_char
, że nie chce żadnych wyściółkę z czołowych miejsc.źródło
ROUND(CAST(FLOAT8 '3.1415927' AS NUMERIC),2);
, otrzymuję „0.314E1”. I mam już napisany kod,ROUND(AVG(val),2)
ale nadal pojawia się błąd opisany w moim pytaniu.ROUND(CAST(FLOAT8 '3.1415927' AS NUMERIC),2);
PgAdmin i Ruby. Z PgAdminem dostaję 3.14, ale z Ruby (używając klejnotu Sequel) dostaję „0.314E1”. Zastanawiam się, dlaczego to jest ...double
wersjaround
musiałaby wrócićnumeric
lub (ugh)text
, więc równie dobrze mogłaby przyjąćnumeric
argument.Spróbuj także starej składni przesyłania,
współpracuje z dowolną wersją PostgreSQL.
W niektórych funkcjach PostgreSQL brakuje przeciążeń , dlaczego (???): Myślę, że „to brak” (!), Ale @CraigRinger, @Catcall i zespół PostgreSQL zgadzają się co do „historycznego uzasadnienia pg”.
PS: innym punktem zaokrąglania jest dokładność , sprawdź odpowiedź @ IanKenney .
Przeciążenie jako strategia rzutowania
Możesz przeładować funkcję ROUND za pomocą,
Teraz twoja instrukcja będzie działać poprawnie, spróbuj (po utworzeniu funkcji)
ale zwraca typ NUMERYCZNY ... Aby zachować pierwsze przeciążenie komom, możemy zwrócić typ FLOAT, gdy oferowany jest parametr TEXT,
Próbować
PS: sprawdzanie
\df round
po przeciążeniu pokaże coś takiego,Te
pg_catalog
funkcje są te domyślne, patrz instrukcja z wbudowanym funkcji matematycznych .źródło
Spróbuj tego:
Lub po prostu:
źródło
możesz użyć funkcji poniżej
wynik pokaże:
możesz także rzutować zmienną na pożądany typ:
źródło
Zgodnie z odpowiedzią Bryana możesz to zrobić, aby ograniczyć liczby dziesiętne w zapytaniu. Przeliczam z km / h na m / s i wyświetlam go na dygraphach, ale kiedy zrobiłem to na dygraphach, wyglądało to dziwnie. Wygląda dobrze podczas wykonywania obliczeń w zapytaniu. To jest na postgresql 9.5.1.
źródło
Spróbuj przerzucić kolumnę na wartość liczbową, taką jak:
źródło
Rozwiązanie : Musisz dodać rzutowany typ, to zadziała
Dawny:
round(extract(second from job_end_time_t)::integer,0)
źródło
wybierz OKRĄGŁY (SUMA (kwota) :: numeryczny, 2) jako suma_w sumie Z transakcji
daje: 200234.08
źródło