ORA-01861: 文字与格式字符串不匹配,能看看什么问题吗?(语言-java)

EmpMapper

img

xml

img

test

img

==> Preparing: select * from emp where name like concat(concat('%',?),'%') and gender = ? and entrydate between to_date(?,'yyyy-mm-dd') and to_date(?,'yyyy-mm-dd')
==> Parameters: 张(String), 1(Short), 2010-01-01(LocalDate), 2020-01-01(LocalDate)

Error querying database. Cause: java.sql.SQLDataException: ORA-01861: 文字与格式字符串不匹配

时间参数

 2010-01-01(LocalDate)

参数就是时间类型,为啥还用to_date转换,to_date转换的是将字符串时间函数格式化为时间格式。

援引讯飞星火:
根据提供的信息,ORA-01861错误是Oracle数据库的错误代码,表示文字与格式字符串不匹配。这个错误通常发生在使用SQL查询语句时,当使用的格式字符串与实际的参数值不匹配时会引发该错误。

在给定的查询中,出现了一个格式字符串 concat(concat('%',?),'%'),它用于构建模糊查询条件。然而,提供的参数值 "张" 是一个中文字符,而不是一个有效的格式字符串。

要解决这个问题,你需要确保参数值与格式字符串的类型和格式相匹配。在这种情况下,你可以尝试将参数值转换为适当的类型,例如使用Java中的 toUpperCase() 方法将中文字符转换为大写形式。

以下是修改后的查询示例:

String name = "张";
short gender = 1;
LocalDate entryDateStart = LocalDate.of(2010, 1, 1);
LocalDate entryDateEnd = LocalDate.of(2020, 1, 1);

String query = "select * from emp where name like concat(concat('%',?),'%') and gender = ? and entrydate between to_date(?,'yyyy-mm-dd') and to_date(?,'yyyy-mm-dd')";

PreparedStatement statement = connection.prepareStatement(query);
statement.setString(1, name.toUpperCase()); // 将参数值转换为大写形式
statement.setShort(2, gender);
statement.setDate(3, Date.valueOf(entryDateStart));
statement.setDate(4, Date.valueOf(entryDateEnd));

ResultSet resultSet = statement.executeQuery();
// 处理查询结果

请注意,这只是一个示例,具体的解决方法可能因你的代码和数据库结构而有所不同。确保根据实际情况进行适当的调整。

你这个to_date函数确定有这个函数吗

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
ORA-01861错误表示提供的文本与格式字符串不匹配。根据您提供的信息,问题可能出现在日期的格式化上。在您的查询中,使用了to_date(?,'yyyy-mm-dd')将日期参数转换为Oracle日期类型。

请确保在调用查询之前,将日期参数正确格式化为'yyyy-mm-dd'的字符串。在Java中,您可以使用SimpleDateFormat类来格式化日期。以下是一个示例:

import java.text.SimpleDateFormat;
import java.util.Date;

// ...

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
String formattedStartDate = dateFormat.format(startDate);
String formattedEndDate = dateFormat.format(endDate);

// 将上述格式化后的日期字符串作为参数传递给查询

请注意,startDateendDatejava.util.Date类型的日期对象。根据您的代码和输入,您可能需要相应地调整日期对象的获取方式。
确保在查询中使用正确格式化的日期字符串作为参数,以解决ORA-01861错误。如果问题仍然存在,请提供更多与日期处理相关的代码和信息,以便我能够更详细地帮助您。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

  1. sql的日期格式化和代码的格式化不一样,sql用 %Y-%m-%d格式化;
  2. concat函数写的重复了,concat(?,?,?,?) 里面是可变长度的,可以放多个参数
select * from emp where name like concat('%',#{name},'%') and gender = #{gender} and entrydate between date_format(#{begin},'%Y-%m-%d') and  date_format(#{end},'%Y-%m-%d')

【以下回答由 GPT 生成】

问题的原因是在进行日期类型的比较时,传入的参数值与指定的日期格式字符串不匹配,导致数据库引发ORA-01861错误。

解决方案如下:

  1. 确保传入参数的类型与数据库中的字段类型一致。例如,入职日期字段(entrydate)的数据库类型是日期(Date),则在传入参数时应使用Java的java.util.Date类型或其子类,如java.sql.Date

  2. 确保传入日期的格式与指定的日期格式字符串一致。对于上述问题中的日期格式字符串'yyyy-mm-dd',要确保传入的日期字符串与该格式一致。你可以使用SimpleDateFormat类将字符串解析为日期类型,或直接使用java.sql.Date提供的构造方法创建日期对象。以下是示例代码:

java String dateStr = "2010-01-01"; SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); java.util.Date utilDate = dateFormat.parse(dateStr); java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime());

或者:

java String dateStr = "2010-01-01"; java.sql.Date sqlDate = java.sql.Date.valueOf(dateStr);

  1. 确保传入正确的参数值。在问题描述中,性别字段(gender)的传入值为1,这里假设1表示男性,0表示女性(仅为示例,实际情况可能不同)。请确认性别字段的取值范围,确保传入正确合法的值。

请根据以上解决方案检查你的代码并修复问题。如果还有其他问题,请提供更多的详细信息,以便进一步帮助你解决。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^