sql >> Database teknologi >  >> RDS >> PostgreSQL

Hvordan afrundes REAL type til NUMERISK?

real er en tabsgivende, upræcis flydende kommatype. Den bruger kun 4 bytes til lagring og kan ikke gemme de præsenterede numeriske bogstaver præcist til at begynde med. Derudover afhænger implementeringsdetaljer af din platform. Overvej kapitlet "Floating-Point Types" i manual.

Der er ikke noget galt med hverken round() eller cast() . For nøjagtige resultater skal du bruge numeric til at begynde med.

Funktionsrevision

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;
  • Anfør ikke sprognavnet plpgsql . Det er en identifikator.
  • Giver ingen mening at afrunde til 2 brøkcifre efter casting til numeric(16,2) , som tvangsrunder allerede. Enten - eller ..

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

Endelig skal du opgradere til en aktuel version. Postgres 8.3 har nået EOL og understøttes ikke.




  1. Hvorfor QMYSQL driver ikke indlæst i QT5.2?

  2. BESTIL VED Alias ​​virker ikke

  3. Indsæt værdi efter udfør trigger

  4. Hvordan aktiverer man phps mysql-udvidelser i docker-container?