zoukankan      html  css  js  c++  java
  • 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=# 
    

      

  • 相关阅读:
    0806 c#总复习
    0804 递归
    0808 html基础
    0803结构体,枚举类型
    0801out传值
    0731函数
    0730特殊集合
    0728多维数组,ArrayList集合
    js 获取url链接的任意参数
    jq dom操作
  • 原文地址:https://www.cnblogs.com/abclife/p/12679671.html
Copyright © 2011-2022 走看看