postgresql中的money數據類型


pg中money類型以固定的分數精度存儲貨幣金額;如下表:

名稱 存儲大小 描述 范圍
money 8bytes 貨幣金額 -92233720368547758.08 to +92233720368547758.07

 

 

 

表中顯示的范圍假設有兩位小數。

 

分數精度由數據庫的lc_monetary設置決定。

postgres=# show lc_monetary;
 lc_monetary 
-------------
 en_US.UTF-8
(1 row)

postgres=# 

  

輸入可以采用多種格式,包括整數和浮點數值,以及典型的貨幣格式,如'$1,000.00'。輸出結果通常是后一種形式,但取決於語言環境。

 

由於該數據類型的輸出結果是位置敏感的,因此將貨幣數據加載到具有不同的lc_monetary設置的數據庫中可能無法工作。為了避免出現問題,在將轉儲恢復到新數據庫之前,請確保lc_monetary的值與轉儲的數據庫中的值相同或相等。

numeric, int, 和bigint型數據類型的值可以轉換為money類型。從real和double precision類型轉換可以通過先轉換為numeric類型來完成,例如:

postgres=# SELECT '12.34'::float8::numeric::money;
 money  
--------
 $12.34
(1 row)

postgres=# 

  

但是,不建議這樣做。不應該使用浮點數來處理money類型,因為可能會出現舍入錯誤。

money類型可以轉換為numeric,而不損失精度。轉換成其他類型可能會失去精度,還必須分兩個階段完成:

postgres=# SELECT '52093.89'::money::numeric::float8;
  float8  
----------
 52093.89
(1 row)

postgres=# 

money類型除以整數值時,小數部分截斷為零。要得到四舍五入的結果,可以用浮點值除,或者在除之前將money值轉換為numeric值,然后再轉換回money值。(后者更可取,以避免喪失精度的風險。)當一個money值除以另一個money值時,結果是雙倍精度(即,一個純粹的數字,而不是money);貨幣單位在除法中相互抵消。

 

postgres=# create table money_test(m money);
CREATE TABLE
postgres=# insert into money_test values(123.456);
INSERT 0 1
postgres=# insert into money_test values(123.454);
INSERT 0 1
postgres=# show lc_monetary;
 lc_monetary 
-------------
 zh_CN.UTF-8
(1 row)
postgres=# select * from money_test;
    m     
----------
 ¥123.46
 ¥123.45
(2 rows)
postgres=# set lc_monetary='en_US.UTF-8';    
SET
postgres=# select * from money_test;
    m    
---------
 $123.46
 $123.45
(2 rows)
postgres=# select sum(m) from money_test; 
   sum   
---------
 $246.91
(1 row)

postgres=# 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM