常用的日期格式转换函数(达梦数据库为例)

  • 字符串转日期/日期转字符串
    • 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')

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐