当前位置: 首页 > 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 +'}';}
}

 

相关文章:

  • hiveserver负载均衡配置
  • cpp_05_类_string类
  • Vue3 性能优化
  • Java 解决远程调用 ssl 证书认证问题
  • 智能优化算法应用:基于鹈鹕算法3D无线传感器网络(WSN)覆盖优化 - 附代码
  • 探索微软Edge:使用方法和心得分享
  • 【快速开发】使用SvelteKit
  • Django Rest Framework框架的安装
  • ChatGPT免费 | 8个免费使用GPT-4的方法
  • [node] Node.js的全局对象Global
  • HarmonyOS构建第一个ArkTS应用(FA模型)
  • C#上位机与欧姆龙PLC的通信04---- 欧姆龙plc的存储区
  • 『番外篇五』SwiftUI 进阶之如何动态获取任意视图的 tag 和 id 值
  • flutter开发windows应用的库
  • 服务器运维 专有名词
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • 【391天】每日项目总结系列128(2018.03.03)
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • JavaScript对象详解
  • Java方法详解
  • Laravel 实践之路: 数据库迁移与数据填充
  • MD5加密原理解析及OC版原理实现
  • mongo索引构建
  • mysql中InnoDB引擎中页的概念
  • nginx 配置多 域名 + 多 https
  • Redash本地开发环境搭建
  • swift基础之_对象 实例方法 对象方法。
  • 后端_MYSQL
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 机器学习中为什么要做归一化normalization
  • 七牛云假注销小指南
  • 容器服务kubernetes弹性伸缩高级用法
  • 想使用 MongoDB ,你应该了解这8个方面!
  • 用Canvas画一棵二叉树
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • (2)Java 简介
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (四)图像的%2线性拉伸
  • (算法)前K大的和
  • (一)认识微服务
  • (转)Android学习笔记 --- android任务栈和启动模式
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .net core webapi 大文件上传到wwwroot文件夹
  • .NET Framework 服务实现监控可观测性最佳实践
  • .NET MVC 验证码
  • .Net Web窗口页属性
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献
  • .NetCore 如何动态路由
  • .NET关于 跳过SSL中遇到的问题
  • .NET简谈设计模式之(单件模式)
  • .sys文件乱码_python vscode输出乱码