将数据插入我的oracle数据库时出现以下错误。
java.sql.SQLException: ORA-01843: not a valid month
在数据库中日期为:dd-MMM-yy(06-MAR-12)
我通过以下方法将06-03-2012转换为dd-MMM-yy:
String s="06-03-2012";
String finalexampledt = new SimpleDateFormat("dd-MMM-yy").format(new SimpleDateFormat("dd-MM-yyyy").parse(s));
所以我得到了06-Mar-12,它与上面的数据库日期格式相同,但我仍然收到错误。我插入:
index.jsp 中的
String todaydate="";
Calendar calendar1 = Calendar.getInstance();
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
todaydate = dateFormat.format(calendar1.getTime());
<input type="text" name="datename" value="<%=todaydate%>"/>
在servlet(doPost)中
String s=request.getParameter("datename");
PreparedStatement ps=con.prepareStatement("insert into tablename(rest_dt, othercolname) values (to_date(?, 'dd-mm-yyyy'), ?)");
ps.setString(1, s);
ps.setString(2, otherstringdata);
int rs=ps.executeUpdate();
请知道
答案 0 :(得分:5)
所以制作
("insert into mytablename (rest_dt) values to_date(?, 'DD-MM-YYYY')");
试试这个
TO_DATE(?, 'DD-MM-YYYY','NLS_DATE_LANGUAGE = American')
//来自Oracle docs
答案 1 :(得分:1)
问题是oracle使用NLS_DATE_LANGUAGE来获取当月的当前名称。所以你应该做
select * from nls_session_parameters
并检查您是否具有正确的值。您还可以选择以下选项,选择您当月获得的名称
select TO_CHAR(TO_DATE('01-03-01', 'DD-MM-YY'), 'MON') from dual
我真的不明白为什么要将变量作为字符串值插入。只需在java中使用日期类型(在客户端上执行转换)并插入它而不进行转换。如果你真的想把它作为字符串插入,我会使用转换为dd-MM-yyyy之类的东西,并将其插入TO_DATE(,'DD-MM-YYYY')。
编辑:
在客户端上转换日期并使用
ps.setDate(2, <yourDate>);
答案 2 :(得分:1)
您的rest_dt列的数据类型为DATE
,因此您需要提供一个。{1}}。您可以使用TO_DATE
函数将字符串转换为Oracle DATE,因此您的插入语句
insert into tablename(rest_dt, othercolname) values (to_date(?, 'dd-mm-yyyy'), ?)
很好。
只需确保绑定到第一个?变量的字符串值的格式为dd-mm-yyyy。并且不要自己转换或格式化该值:TO_DATE函数执行该部分。
此处不需要任何关于会话设置的内容,例如nls_date_language,因为您明智地选择使用MM掩码(而不是MON)来使用与语言无关的设置。
的问候,
罗布。
答案 3 :(得分:0)
在 Java 中运行大查询(多联合)时遇到的同样问题,而不是实际输入的问题,因为我已将 to_date('30-06-2021', 'dd-MM-yyyy')
正确转换,发现问题在于查询中的 date1。
例如
select a,b,c from table1 where date1='31/12/2015'and date2=<actual input>
union
select a,b,c from table2 where date1='31/12/2015'and date2=<actual input>
union
select a,b,c from table3 where date1='31/12/2015'and date2=<actual input>
.
.
date1 也应该像下面这样转换为 to_date
例如
select a,b,c from table1 where date1=to_date('31/12/2015', 'dd-MM-yyyy') and date2=<actual input>
因此问题解决了。我的建议是,如果您遇到此类问题,请检查查询中的日期部分并使用 to_date
提及。
Java 代码:
@Autowired
private NamedParameterJdbcTemplate namedJdbcTemplate;
List<ResponseDTO> list = new ArrayList<>();
MapSqlParameterSource params = new MapSqlParameterSource();
params.addValue("value1", dto.getValue1());
params.addValue("value2", dto.getValue2());
list = namedJdbcTemplate.query(SQL_QUERY, params, new CustomValueMapper());
这纯粹是我自己的经验。如果有帮助,请点击投票。
答案 4 :(得分:0)
不要将日期作为字符串传入或传出数据库。传输正确的日期对象。我假设您的 JDBC 驱动程序至少符合 JDBC 4.2。几乎所有的司机都是这些天。在这种情况下,LocalDate
是用于日期的类型,无论是在您的 Java 程序中还是在传输到数据库中。
所以你基本上需要的是:
LocalDate date = LocalDate.of(2012, Month.MARCH, 6);
PreparedStatement ps = con.prepareStatement(
"insert into tablename(rest_dt, othercolname) values (?, ?)");
ps.setObject(1, date);
ps.setString(2, otherstringdata);
int rs = ps.executeUpdate();
如果您从 JSP 接收作为字符串输入的日期,请立即将其解析为 LocalDate
对象。无需等到需要将其放入数据库。
String inputString = "06-03-2012"; // Meaning 6 March 2012
LocalDate date = LocalDate.parse(inputString, DATE_PARSER);
我一直在使用这个格式化程序:
private static final DateTimeFormatter DATE_PARSER
= DateTimeFormatter.ofPattern("dd-MM-uuuu", Locale.ROOT);