> 文章列表 > MySQL:varchar与date类型互转,对接java数据类型String和Date

MySQL:varchar与date类型互转,对接java数据类型String和Date

MySQL:varchar与date类型互转,对接java数据类型String和Date

目录

问题现象:

问题分析:

varchar 转 date :

date 转 varchar:

 解决方法:

varchar 转 date :

date 转 varchar:


问题现象:

        今天在项目中遇到一个问题:

现象:

        调用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】相同的时间格式级别,然后再来匹配值,从而查询出结果。