PostGreSQL:货币类型

news/2024/7/9 21:57:13 标签: postgresql, 货币类型, 数据库, 数据类型

货币类型:money    

    money类型存储固定小数精度的货币数字,小数的精度由数据库的lc_monetary设置决定。windows系统下,该配置项位于/data/postgresql.conf文件中,默认配置如下,

lc_monetary = 'Chinese (Simplified)_China.936'            # locale for monetary formatting

货币类型输入输出格式

        可接受的输入格式很多,包括整数和浮点数文字,以及常用的货币格式,如'$1,000.00'。 输出通常是最后一种形式,但和区域相关。也就是说:money这种数据类型的输出格式是和区域相关的。例如:上述配置对应于中国区域,那么货币的输出格式就为:

SELECT id,name,money FROM "tb_account"
ORDER BY id

        查询结果如下,

        因此将money数据装入到一个具有不同lc_monetary设置的数据库是不起作用的。为了避免这种问题,在恢复一个转储到一个新数据库中之前,应确保新数据库lc_monetary设置和被转储数据库的相同或者具有等效值。

货币类型与其它数据类型相互转换

        在实际开发中,我们经常接触到的金额数值一般为小数类型,但是,PostGreSQL货币类型由于输出格式带有前缀$或者¥,显然是无法直接映射到Double/Float/Int等数值类型的,尤其是在使用MyBatis框架时。

        为了解决这类问题,PostGreSQL提供了类型转换的实现方式。

其它类型转货币类型

        数据类型numericintbigint的值可以被造型成money。从数据类型realdouble precision的转换可以通过先造型成numeric来实现,例如:

SELECT '12.34'::float8::numeric::money;

        对应于MyBatis框架,使用方式如下,

  <update id="update" parameterType="com.example.demo.demos.pojo.Account">
        UPDATE tb_account
        <trim prefix="SET" suffixOverrides=",">
            <if test="account.name != null and account.name != ''">
                name = #{account.name},
            </if>
            <if test="account.money != null">
                money = #{account.money}::float8::numeric::money,
            </if>
        </trim>
        WHERE id = #{account.id}
   </update>

货币类型转其它类型

        一个money值可以在不损失精度的情况下被造型成numeric。转换到其他类型可能会丢失精度,并且必须采用两个阶段完成:

SELECT '52093.89'::money::numeric::float8;

        对应于MyBatis框架,使用方式如下,

<select id="selectList" resultType="com.example.demo.demos.pojo.Account">
        SELECT id,name,money::money::numeric::float8 as money
        FROM tb_account
</select>

        tb_account表对应的pojo实体类定义如下,

package com.example.demo.demos.pojo;


import java.io.Serializable;

public class Account implements Serializable {
    private static final long serialVersionUID = 3327456920493219212L;

    /**
     * id-主键
     */
    private Integer id;

    /**
     * name-账户名
     */
    private String name;

    /**
     * money-金额
     */
    private Double money;

    //setter
    public void setId(Integer id) {
        this.id = id;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setMoney(Double money) {
        this.money = money;
    }


    //getter
    public Integer getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public Double getMoney() {
        return money;
    }

    //constructor
    public Account() {
    }

    public Account(Integer id, String name, Double money) {
        this.id = id;
        this.name = name;
        this.money = money;
    }

    //methods
    @Override
    public String toString() {
        return "Account{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", money=" + money +
                '}';
    }
}

 


http://www.niftyadmin.cn/n/5283502.html

相关文章

基于SSM和BS的高考志愿资讯平台的设计与实现

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SSM和BS的高考志愿资讯平台的设计与…

c语言:求1/2+2/3+3/4+……n-1/n的和|练习题

一、题目 求1/22/33/4……n-1/n的和 如图&#xff1a; 二、思路分析 1、1/2、2/3、3/4……可以用(i/i1) 2、设置一个函数&#xff0c;求数的相加之和 三、代码截图【带注释】 四、源代码【带注释】 #include <stdio.h> int main() { int num; printf("输入…

C++力扣题目541--反转字符串II

给定一个字符串 s 和一个整数 k&#xff0c;从字符串开头算起&#xff0c;每计数至 2k 个字符&#xff0c;就反转这 2k 字符中的前 k 个字符。 如果剩余字符少于 k 个&#xff0c;则将剩余字符全部反转。如果剩余字符小于 2k 但大于或等于 k 个&#xff0c;则反转前 k 个字符&…

力扣45. 跳跃游戏 II

贪心算法 思路&#xff1a; 在 pos 位置&#xff0c;能跳到 pos nums[pos] 位置&#xff1b;正向遍历数组&#xff0c;迭代出能跳到的最大位置&#xff1a; maxPos std::max(maxPos, idx nums[idx]); 在遍历到最大位置的地方则更新步数&#xff0c;并重新统计基于此位置能跳…

从命令行里打开pycharm项目

从命令行里打开pycharm项目 在MacBook 笔记本下面,想通过 pycharm 路径 这种方式打开项目, 这样是不是很方便呢. 于是找了一下, 还真的可以. 只要编写一个简单的脚步即可实现. 编写脚本 pycharm 把脚本路径放到 Path环境变量中. #!/bin/sh # 脚本名称: pycharm # 通过命令行…

tcp 的限制 (TCP_WRAPPERS)

#江南的江 #每日鸡汤&#xff1a;青春是打开了就合不上的书&#xff0c;人生是踏上了就回不了头的路&#xff0c;爱情是扔出了就收不回的赌注。 #初心和目标&#xff1a;拿到高级网络工程师 TCP_WRAPPERs Tcp_wrappers 对于七层模型中是位于第四层的安全工具&#xff0c;他…

【并发设计模式】聊聊两阶段终止模式如何优雅终止线程

在软件设计中&#xff0c;抽象出了23种设计模式&#xff0c;用以解决对象的创建、组合、使用三种场景。在并发编程中&#xff0c;针对线程的操作&#xff0c;也抽象出对应的并发设计模式。 两阶段终止模式- 优雅停止线程避免共享的设计模式- 只读、Copy-on-write、Thread-Spec…

Qml之自定义Button

Qml之自定义Button 前言一、图标Button二、字体Button1.重写Background和ContentItem2.采用ButtonStyle 前言 提示&#xff1a; 自定义Button控件如何分为带图片的Iconbutton和原生控件重写的Button。最终效果如下&#xff1a; 提示&#xff1a;以下是本篇文章正文内容&#x…