mybatis中进行时间范围查询

一 oracle数据库

数据库时间类型为DATE
在这里插入图片描述
TO_CHAR 把日期或数字转换为字符串
TO_DATE 把字符串转换为数据库中的日期类型 TO_DATE(char, ‘格式’)
TO_NUMBER 将字符串转换为数字 TO_NUMBER(char, ‘格式’)

1、入参是String类型的数据

在这里插入图片描述

mybatis 处理时间范围

使用TO_DATE函数将String类型的时间转成yyyy-MM-dd格式时间。
这种写法时间范围查询会有问题,此时的=号会失效,因为VOUCHER_TIME 是具体到时分秒的,TO_DATE(#{jyzbLedger.voucherTimeFrom},‘yyyy-MM-dd’)转成时间时丢失了时分秒,导致==判断不成立。最终丢失等值数据

  <if test="jyzbLedger.voucherTimeTo != null and jyzbLedger.voucherTimeTo != ''">
     and VOUCHER_TIME <![CDATA[>= ]]> TO_DATE(#{jyzbLedger.voucherTimeTo},'yyyy-MM-dd')
   </if>
   <if test="jyzbLedger.voucherTimeFrom != null and jyzbLedger.voucherTimeFrom != ''">
      and VOUCHER_TIME <![CDATA[<= ]]> TO_DATE(#{jyzbLedger.voucherTimeFrom},'yyyy-MM-dd')
   </if>

正确写法
先试用TO_CHAR将日期转成yyyy-MM-dd格式字符串,然后使用TO_DATE转成日期

  <if test="jyzbLedger.voucherTimeTo != null and jyzbLedger.voucherTimeTo != ''">
     and TO_DATE( TO_CHAR( VOUCHER_TIME, 'yyyy-MM-dd' ), 'yyyy-MM-dd' ) <![CDATA[>= ]]> TO_DATE(#{jyzbLedger.voucherTimeTo},'yyyy-MM-dd')
   </if>
   <if test="jyzbLedger.voucherTimeFrom != null and jyzbLedger.voucherTimeFrom != ''">
      and TO_DATE( TO_CHAR( VOUCHER_TIME, 'yyyy-MM-dd' ), 'yyyy-MM-dd' ) <![CDATA[<= ]]> TO_DATE(#{jyzbLedger.voucherTimeFrom},'yyyy-MM-dd')
   </if>
MybatisPlus中时间范围查询
 queryWrapper
   .apply(ObjectUtils.isNotEmpty(jyzbLedger.getVoucherTimeTo()),
     "TO_DATE( TO_CHAR( VOUCHER_TIME, 'yyyy-MM-dd' ), 'yyyy-MM-dd' ) >= TO_DATE ({0},'yyyy-MM-dd')", jyzbLedger.getVoucherTimeTo())
   .apply(ObjectUtils.isNotEmpty(jyzbLedger.getVoucherTimeFrom()),
     "TO_DATE( TO_CHAR( VOUCHER_TIME, 'yyyy-MM-dd' ), 'yyyy-MM-dd' ) <= TO_DATE ({0},'yyyy-MM-dd')", jyzbLedger.getVoucherTimeFrom());

TO_DATE( TO_CHAR( VOUCHER_TIME, ‘yyyy-MM-dd’ ), ‘yyyy-MM-dd’ )

2、入参是Date类型的时间数据

Date类型接参数就要和前端固定传参格式比如yyyy-MM-dd,然后使用@DateTimeFormat格式化,不使用 @DateTimeFormat然后使用Date类型接参数会报错

在这里插入图片描述

mybatis 处理时间范围

TO_CHAR 把日期或数字转换为字符串

使用 TO_CHAR 函数将入参日期格式转换成指定格式字符串,将查询的参数也转换成指定格式字符串

<!-- voucherTimeTo为Date类型时不能用 jyzbLedger.voucherTimeTo != '' 判空会报错的          -->
 <if test="jyzbLedger.voucherTimeTo != null ">
     and to_char(VOUCHER_TIME,'yyyy-MM-dd') <![CDATA[>= ]]> to_char(#{jyzbLedger.voucherTimeTo},'yyyy-MM-dd')
 </if>
 <if test="jyzbLedger.voucherTimeFrom != null ">
      and to_char(VOUCHER_TIME,'yyyy-MM-dd') <![CDATA[<= ]]> to_char(#{jyzbLedger.voucherTimeFrom},'yyyy-MM-dd')
 </if>
MybatisPlus中时间范围查询

参考上面的

二 mysql数据库

数据库时间类型为DATE
在这里插入图片描述

2、入参是Date类型的时间数据

  1. 入参
achievementDateStart: 2023-04-26
achievementDateStartEnd: 2023-05-19
  1. 接收参数类型
    /**
     * 业绩时间-开始
     */
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @ApiModelProperty(value = "业绩时间-开始")
    private Date achievementDateStart;

    /**
     * 业绩时间-结束
     */
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @ApiModelProperty(value = "业绩时间-结束")
    private Date achievementDateStartEnd;

mybatis 处理时间范围

date_format 将Date类型参数格式化成指定类型的时间

   <if test="oppConditionVO.achievementDateStart != null and oppConditionVO.achievementDateStartEnd != null">
     and date_format( achievement_date, '%Y-%m-%d' )
      BETWEEN date_format( #{oppConditionVO.achievementDateStart}, '%Y-%m-%d' ) 
      and date_format( #{oppConditionVO.achievementDateStartEnd}, '%Y-%m-%d' )
  </if>
MybatisPlus中时间范围查询
  queryWrapper.apply(oppConditionVO.getAchievementDateStart() != null,
                        "date_format (achievement_date,'%Y-%m-%d') >= date_format ({0},'%Y-%m-%d')", oppConditionVO.getAchievementDateStart())
                .apply(oppConditionVO.getAchievementDateStartEnd() != null,
                        "date_format (achievement_date,'%Y-%m-%d') <= date_format ({0},'%Y-%m-%d')", oppConditionVO.getAchievementDateStartEnd());

Mybatis-Plus时间范围查询

猜你喜欢

转载自blog.csdn.net/weixin_43811057/article/details/130388943