达梦数据库接口开发(日期格式转换)
在接口开发过程中,如果数据源的数据是连续插入进入源表中,并且当新数据到达时,老数据不会被删除。而业务处理过程中,只需要最新一批的数据时,我们可以对数据的create_time进行开窗倒序排序,然后只取rn=1的数据,保证每次取得的结果都是最新数据。其中还分两种不同的业务需求:
·
常用的日期格式转换函数(达梦数据库为例)
- 字符串转日期/日期转字符串
to_date(字符串, 'yyyy-mm-dd')
to_char(date, 'yyyy-mm-dd')
- 日期转时间戳/时间戳转日期
UNIX_TIMESTAMP(datetime) :
返回自标准时区的’1970-01-01 00:00:00 +0:00’的到本地会话时区的指定时间的秒数差from_unixtime(unixtime):
返回将自’1970-01-01 00:00:00’的秒数差转成本地会话时区的时间戳类型
- 字符串转时间戳/时间戳转字符串
- 日期字符串->日期date->时间戳timestamp
- 时间戳timestamp->日期date->日期字符串
- 日期格式化
date_format(date, format):
以不同的格式显示日期/时间数据- yyyy: 年
- mm:月
- dd:日
- 使用
concat()
或者||
对年月日进行拼接 substr(string, m, n):
返回 char 中从字符位置 m 开始的 n 个字符- 若 m 为 0,则把 m 就当作 1 对待。
- 若 m 为正数,则返回的字符串是从左边到右边计算的;
- 反之,返回的字符是从 char 的结尾向左边进行计算的。返回 char 中从字符位置 m 开始的 n 个字符。
- 如果没有给出 n,则返回 char 中从字符位置 m 开始的后续子串。
instr(str1, str2, n,[m]):
返回 str1 中包含 str2 的特定位置。INSTR
从 str1 的左边开始搜索,开始位置是 n- 如果 n 为负数,则搜索从 str1 的最右边开始,当搜索到 str2 的第 m 次出现时,返回所在位置
- n 和 m 的缺省值都为 1,即返回 str1 中第一次出现 str2 的位置,这时与 POSITION 相类似
- 如果从 n 开始没有找到第 m 次出现的 str2,则返回 0
- n 和 m 以字符作为计算单位,一个西文字符和一个汉字都作为一个字符计算。
- 日期的加减
ADD_DAYS(date,n):
返回日期加上 n 天后的新日期ADD_MONTHS(date,n):
在输入日期上加上指定的几个月返回一个新日期ADD_WEEKS(date,n):
返回日期加上 n 个星期后的新日期DATEADD(datepart,n,date):
向指定的日期加上一段时间TIMESTAMPADD(datepart,n,timestamp):
返回时间戳 timestamp 加上 n 个 datepart 指定的时间段的结果
- 日周月年相关函数:
day(date):
返回日期中的天数week(date):
返回日期为所在年中的第几周month(date):
返回日期中的月份分量minute(time):
返回时间中的分钟
- 其他
days/weeks/months/years_between():
返回两个日期之间的天数、周数、月份数、年数LAST_DAY(date):
返回输入日期所在月份最后一天的日期OVERLAPS (date1,date2,date3,date4):
返回两个时间段是否存在重叠,date1 为 datetime 类型、date2 可以为 datetime 类型也可以为 interval 类型,date3 为 datetime 类型,date4 可为 datetime 类型,也可以 interval 类型,判断(date1,date2),(date3,date4)有无重叠。其中 date2 与 date4 类型必须一致,如果 date2 为 interval
常用的注解
@JsonFormat(pattern="yyyy-MM-dd",timezone = "GMT+8")
:- 作用:既可以约束前端传入的时间参数格式,也可以约束后端响应前端的时间类型格式
- 参数
- pattern: 是你需要转换的时间日期的格式
- timezone: 时间设置为东八区,避免时间在转换中有误差
- 位置:可以放在bean对象属性字段的上方,也可以在属性对应的get方法上。
@Accessors()
:当属性字段在生成 getter 和 setter 方法时,做一些相关的设置fluent:
不写默认为false,当该值为 true 时,对应字段的 getter 方法前面就没有 get,setter 方法就不会有 set。chain:
通过chain属性,我们可以控制是否生成返回当前对象的访问器方法,以支持链式调用。prefix:
该属性是一个字符串数组,默认值为空,该数组有值的时候,表示忽略字段对应的前缀,生成对应的getter和setter方法。
@Data:
注在类上,提供类的get、set、equals、hashCode、canEqual、toString方法@TableId(value = "ID", type = IdType.AUTO):
表示id字段是数据库表的主键,列名为"ID",并且主键值由数据库自动生成@TableField(value = "YEARS"):
用于映射Java对象(通常是一个实体类)到数据库表中的字段。
接口开发原则
- 单一职责原则:每个类应该只有一个引起它变化的原因。这意味着每个类应该只负责一项任务。
- 开闭原则:软件实体应该对扩展开放,对修改关闭。这意味着在不修改现有代码的情况下,应该能够扩展功能。
- 接口隔离原则:客户端不应该依赖它不使用的接口,一个类对另一个类的依赖应该建立在最小的接口上。
- VO(Value Object):
- 用于展示层,通常包含多个属性,并且这些属性通常都会一起使用。
- 可以包含一些不用于数据库操作的方法,比如格式化输出等。
- DO(Data Object):
- 与数据库表结构一一对应,仅用于数据库的CRUD操作。
- 通常不包含业务逻辑,只包含数据字段。
- Mapper:
- 负责数据库的增删改查操作,通常使用MyBatis等ORM框架来实现。
- 应该尽可能地保持简单,只包含与数据库交互的代码。
- Service层:
- 包含业务逻辑,是业务流程的抽象。比如业务需求只要2023年以后的数据,应该写在service层中
- 应该调用Mapper层进行数据持久化。
- 可以包含事务管理
项目实战总结
- vo对象设置小数点后面保留位数
@JSONFormat(pattern = "#.##"):
- 3 -> 3.0
- 3.1342 -> 3.13
@JSONFormat(pattern = "#.00"):
- 3 -> 3.00
- 3.14159 -> 3.14
- map算子和foreach算子的区别
- 相同点:都是对数据进行遍历操作
- 不同点:
- foreach方法没有返回值
- map方法会返回数组中每个元素映射后的结果
- xml文件中如何对非必填参数进行动态变化
- 使用
<where> <if> 动态sql过滤</if></where>
- 使用
<where>
<if test="tuberculosisType != null">
INDEX_TYPE = #{tuberculosisType}
</if>
</where>
- 如何使用filter对数据进行过滤:
- 首先判断filter上游数据的数据类型
- 给数据元素定义一个别名
- 使用Lamda表达式,函数右侧通过调用数据元素的某个字段来进行真假判断
- 返回值为false的数据元素会被过滤,返回为true的值进去下游算子中
比如这个是去掉数据元素中区划为全市的例子:.filter(adsCrbzhglptGjjFrmzSd -> !adsCrbzhglptGjjFrmzSd.getBgdq().equals("全市"))
开窗函数
在接口开发过程中,如果数据源的数据是连续插入进入源表中,并且当新数据到达时,老数据不会被删除。而业务处理过程中,只需要最新一批的数据时,我们可以对数据的create_time进行开窗倒序排序,然后只取rn=1的数据,保证每次取得的结果都是最新数据。
- 其中还分两种不同的业务需求:
- 只需要最新一批的数据中的一条数据:
- 保证数据是最新一批,可以返回多条数据:将row_number开窗函数改成dense_rank()函数即可。
with t1 as (
select
ID,
YEARS,
DATA_STR,
PLACES,
POSITIVE_RATE,
CREATE_TIME,
row_number()over(order by CREATE_TIME desc) RN
from Table_name
)
select
ID,
YEARS,
DATA_STR,
PLACES,
POSITIVE_RATE,
CREATE_TIME,
to_date(concat(years, '/', substr(data_str,instr(data_str,'-')+1)),'YYYY/mm/dd') date_time
from t1
where rn = 1
- 对于
09/01-09/07
格式的日期范围字段如何排序- 截取时间范围的左端点或者右端点
- 拼接上当前的年份
- 使用to_date()函数将字符串转换成date类型
- 根据date类型的值进行排序
例子:to_date(concat(years, '/', substr(data_str,instr(data_str,'-')+1)),'YYYY/mm/dd')
更多推荐
已为社区贡献1条内容
所有评论(0)