当前位置: 首页 > news >正文

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 moneyFROM 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;//setterpublic void setId(Integer id) {this.id = id;}public void setName(String name) {this.name = name;}public void setMoney(Double money) {this.money = money;}//getterpublic Integer getId() {return id;}public String getName() {return name;}public Double getMoney() {return money;}//constructorpublic Account() {}public Account(Integer id, String name, Double money) {this.id = id;this.name = name;this.money = money;}//methods@Overridepublic String toString() {return "Account{" +"id=" + id +", name='" + name + '\'' +", money=" + money +'}';}
}

 

http://www.lryc.cn/news/266179.html

相关文章:

  • ESP8266网络相框采用TFT_eSPI库TJpg_Decoder库mixly库UDP库实现图片传送
  • Go 泛型发展史与基本介绍
  • python 解决手机拍的书籍图片发灰的问题
  • 【prompt一】Domain Adaptation via Prompt Learning
  • 视频编辑与制作,添加视频封面的软件
  • Deepin更换仿Mac主题
  • 【Flink-Kafka-To-ClickHouse】使用 Flink 实现 Kafka 数据写入 ClickHouse
  • 浅谈Redis分布式锁(下)
  • Django Rest Framework框架的安装
  • 深度学习(七):bert理解之输入形式
  • 如何用Excel制作一张能在网上浏览的动态数据报表
  • 双向数据绑定是什么
  • 鱼眼标定方式
  • 详解Keras3.0 KerasNLP Models: GPT2 GPT2Tokenizer
  • 2016年第五届数学建模国际赛小美赛B题直达地铁线路解题全过程文档及程序
  • 三秦通ETC续航改造
  • 使用Python实现发送Email电子邮件【第19篇—python发邮件】
  • Docker基本命令和Docker怎么自己制作镜像
  • Netty-2-数据编解码
  • 伽马校正:FPGA
  • 【SpringCloud笔记】(8)服务网关之GateWay
  • Compose常用布局
  • 使用keytool查看Android APK签名
  • 数据库学习日常案例20231221-oracle libray cache lock分析
  • 【数据结构】最短路径算法实现(Dijkstra(迪克斯特拉),FloydWarshall(弗洛伊德) )
  • 算法模板之队列图文详解
  • [node]Node.js 中REPL简单介绍
  • AtomHub 开源容器镜像中心开放公测,国内服务稳定下载
  • java8实战 lambda表达式、函数式接口、方法引用双冒号(中)
  • FPGA高端项目:UltraScale GTH + SDI 视频编解码,SDI无缓存回环输出,提供2套工程源码和技术支持