sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur avrundar man VERKLIG typ till NUMERISK?

real är en förlustlös, inexakt flyttalstyp. Den använder bara 4 byte för lagring och kan inte lagra de presenterade numeriska bokstaverna exakt till att börja med. Dessutom beror implementeringsdetaljer på din plattform. Överväg kapitlet "Flytpunktstyper" i manual.

Det är inget fel med någon av round() eller cast() . För exakta resultat måste du använda numeric till att börja 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;
  • Citera inte språknamnet plpgsql . Det är en identifierare.
  • Det är meningslöst att avrunda till två bråksiffror efter casta till numeric(16,2) , som tvångsrunda redan. Antingen - eller ..

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

Slutligen måste du uppgradera till en aktuell version. Postgres 8.3 har nått EOL och stöds inte.




  1. MySQL:infoga där det inte finns

  2. MySQL-fråga med flera AND-satser verkar ignorera en

  3. Ställ in ett cron-jobb för att uppdatera artikelinformation beroende på dess röstvärden

  4. mysql_fetch_array lägga till alla rader?