sql >> Databáze >  >> RDS >> PostgreSQL

Jak zaokrouhlit typ REAL na NUMERIC?

real je ztrátový, nepřesný typ s plovoucí desetinnou čárkou. Pro ukládání používá pouze 4 bajty a nemůže pro začátek přesně uložit prezentované číselné literály. Podrobnosti implementace navíc závisí na vaší platformě. Zvažte kapitolu „Typy s plovoucí desetinnou čárkou“ v manuál.

Ani s round() není nic špatného nebo cast() . Pro přesné výsledky byste museli použít numeric pro začátek.

Audit funkcí

CREATE OR REPLACE FUNCTION test3()
  RETURNS void AS
$func$
DECLARE
   r record;
BEGIN
   FOR r IN 
      SELECT abs_km AS km
            ,cast(abs_km AS numeric) AS km_cast
            ,round(abs_km::numeric, 2) AS km_round
      FROM   gps_entry
   LOOP
      RAISE NOTICE 'km: % , km_cast: % , km_round: %'
                  , r.km, r.km_cast, r.km_round;
      INSERT INTO test (km, casting, rounding)
      VALUES (r.km, r.km_cast, r.km_round);
   END LOOP;    
END
$func$ LANGUAGE plpgsql;
  • Neuvádějte název jazyka plpgsql . Je to identifikátor.
  • Nemá smysl zaokrouhlovat na 2 desetinné číslice po casting do numeric(16,2) , která už násilně zaokrouhluje. Buď - nebo ..

    round(abs_km:: numeric(16,2), 2) as round
    round(abs_km::numeric, 2) as round
    abs_km::numeric(16,2) as round

Nakonec je potřeba upgradovat na aktuální verzi. Postgres 8.3 dosáhl EOL a není podporován.




  1. Získejte poslední záznam sady výsledků

  2. Zvládněte restart mysql v SQLAlchemy

  3. Problém podmínky WHERE v SQL

  4. Oracle Trigger na vnořené tabulce