目录
问题现象:
今天在项目中遇到一个问题:
现象:
调用springboot接口,根据传入的时间参数(Date类型),查询出对应的数据。
问题:
由于数据库存的时间参数是varchar类型,因此提出:
当参数的数据类型与数据库不一致时,如何转换数据类型并实现条件查询?
问题分析:
首先,针对提出的问题,其实有很多解决方案:
1、在java代码中,转换时间参数的数据类型,保持和数据库的数据类型对应(String->varchar,Date->date):
java的时间转换工具类网上非常多,由于不是本文的重点,这里就不举例了,有兴趣的小伙伴可以上网查找一下。
2、另一种方式就是,在执行dao层sql的时候,通过sql语句来转换时间参数的数据类型或者是数据字段的数据类型,来实现条件查询:
这里,重点讲一下sql关于date和varchar两种数据类型之间的互相转换:
varchar 转 date :
STR_TO_DATE(varchar字段,时间格式)
如:将varchar类型的月份字段格式转为带日期的格式
STR_TO_DATE(end_month,'%Y-%m-%d')
带日期的值才能和 java 的Date类型做映射。
date 转 varchar:
DATE_FORMAT(varchar字段, 时间格式)
如:
DATE_FORMAT(end_month, '%Y-%m')
有一点需要注意的就是,varchar字段本身的时间精度必须比设置的时间格式要精确!
怎么理解呢?
比如上面的 end_month 字段,假如它的值是:'2023-04'
此时如果我们要将这个值的时间格式精确到日期,那时间格式必然要设置为:'%Y-%m-%d',此时若执行sql就会得到null:
显然,这就是因为 '2023-04' 的精确度只到了【月份】,没有到【日期】,无法转换成更精细的时间格式(因为系统也不知道你想精确到哪一天的日期)。
要解决这个问题也很简单,就是先加上日期,再进行转换:
解决方法:
varchar 转 date :
STR_TO_DATE(varchar字段,时间格式)
如:将varchar类型的月份字段格式转为带日期的格式
STR_TO_DATE(end_month,'%Y-%m-%d')
注意:带日期的值才能和 java 的Date类型做映射,否则报错。
date 转 varchar:
DATE_FORMAT(varchar字段, 时间格式)
如:
DATE_FORMAT(end_month, '%Y-%m')
注意:varchar字段本身的时间精度必须比设置的时间格式要精确!否则结果返回null。
开头的问题:
当参数的数据类型与数据库不一致时,如何转换数据类型并实现条件查询?
回答:
假如数据库存的是 varchar类型的字段【end_month】数据,而java中接口获取到的是 Date类型的入参【endDate】,此时要根据入参作为查询条件,获取数据库表数据,就可以执行类似如下的sql语句:
SELECT xxx字段FROM Table表WHERE end_month = Date_format(#{endDate},'%Y-%m')
解析:
【endDate】是Java中的Date类型,作为接口入参时,需要传入至少精确到【秒级】的值,
【end_month】是MySQL中的varchar类型,所以可以先把【endDate】转化为精确到【月份】的字符串,然后再用【end_month】字段来匹配转化后的值,从而查询出结果。
当然也可以使用 STR_TO_DATE 函数将【end_month】字段转化精确到,和【endDate】相同的时间格式级别,然后再来匹配值,从而查询出结果。
来源地址:https://blog.csdn.net/weixin_42585386/article/details/130215791