问题分析:
首先,针对提出的问题,其实有很多解决方案:
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
】相同的时间格式级别,然后再来匹配值,从而查询出结果。
在保存的时候会自带时分秒;
例:‘yyyyMMdd’;'yyyy-mm-dd hh24:mi’等;
可以使用to_char函数将其转化为任意时间格式的字符串,也可使用to_
date
函数转化相应的字符串为日期格式。
我这里使用的to_char函数。
select ...
SELECT to_char(to_
date
(m.ma_
date
time,'yyyy-MM-dd hh24:mi:ss'),
'yyyyMMdd') FROM my_task m;
m.ma_
date
time是
varchar
2
类型
的日期格式,先转换
date
类型
(必须添加时分秒,不然报ora-01830错误)
然后在随心所欲的转换成
varchar
类型
String
length()方法返回的是代码单元数量
上图是
String
类
中
length源码,注意红框部分是代码单元的数量,那我们知道
String
的value其实是一个char[],那我们就可以推出 char = 代码单元
@Test
public void
string
LengthTest() {
//𤭢 \uD852\uDF62
String
str = "𤭢𤭢𤭢𤭢𤭢";
MySQL
是一个关系型数据库管理系统,由瑞典
MySQL
AB 公司开发,属于 Oracle 旗下产品。
MySQL
是最流行的关系型数据库管理系统之一,在 WEB 应用方面,
MySQL
是最好的RDBMS (Relational Database Management System,关系数据库管理系统)应用软件之一。
MySQL
是一种关系型数据库管理系统,关系数据库将数据保存在不同的表
中
,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
在
MySQL
中
,将
varchar
类型
的年月日数据转换为
date
类型
,可以通过使用函数STR_TO_
DATE
()来实现。该函数主要用于将给定的字符转换为日期格式。
假设我们有一个名为my_table的表,其
中
包含一个
varchar
类型
的列
date
_str,存储了年月日的数据,格式为"YYYY-MM-DD"。我们想要将这个列的数据转换为
date
类型
。
可以使用如下的SQL语句来实现转换:
UP
DATE
my_table SET
date
_col = STR_TO_
DATE
(
date
_str, '%Y-%m-%d');
其
中
,
date
_col是我们新添加的
date
类型
的列,用于存储转换后的日期数据。
在这个例子
中
,我们使用了STR_TO_
DATE
()函数并指定了日期格式为'%Y-%m-%d',即年-月-日。这样,函数会将
varchar
类型
的
date
_str列的数据按照给定的格式转换为
date
类型
,并存储到
date
_col列
中
。
需要注意的是,如果出现了格式不匹配或者数据不合法的情况,函数将会返回NULL。因此,在执行转换前,我们需要确保数据的格式正确并且合法。如果不确定数据的格式是否正确,可以在转换前先进行格式验证。
通过上述的方法,我们可以将
varchar
类型
的年月日数据转换为
date
类型
,并在
MySQL
数据库
中
进行使用。
springboot项目启动报错:Field xxxMapper in com...xxxController required a bean of type ‘com...xxxMapper‘
34726