java.sql.SQLException:ORA-01843:不是有效月份

时间:2012-03-06 10:55:39

标签: java sql oracle date

将数据插入我的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();

请知道

5 个答案:

答案 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)

java.time 和 JDBC 4.2

不要将日期作为字符串传入或传出数据库。传输正确的日期对象。我假设您的 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);

链接