Java日历/日期到SQL时间戳/Oracle数据库

Java日历/日期到SQL时间戳/Oracle数据库,java,sql,oracle,Java,Sql,Oracle,目前,我正在尝试将时间戳值插入到Oracle数据库的时间戳字段中 使用当前的时间戳,我可以将数据插入数据库 它返回的时间戳是(2013-11-20.14.50.7.832000000) 所以我会解释这个问题。我需要一个创建的日期/时间(时间戳)和一个过期的日期/时间(时间戳)。所以我使用Java日历来处理额外的天数。例如,添加365天以获得一年的到期日 以下是我当前的Java日期代码: public Date GetCurrentDate(HttpServletRequest reque

目前,我正在尝试将时间戳值插入到Oracle数据库的时间戳字段中

使用当前的时间戳,我可以将数据插入数据库

它返回的时间戳是(2013-11-20.14.50.7.832000000

所以我会解释这个问题。我需要一个创建的日期/时间(时间戳)和一个过期的日期/时间(时间戳)。所以我使用Java日历来处理额外的天数。例如,添加365天以获得一年的到期日

以下是我当前的Java日期代码:

    public Date GetCurrentDate(HttpServletRequest request, HttpServletResponse response) throws Exception{

    //Create current Date
    Calendar cal = new GregorianCalendar();
    Date creationDate = cal.getTime();

    
    
    return creationDate;


}

     Date datereturn = GetCurrentDate(request,response);
         java.sql.Timestamp timestampcurrent = new Timestamp(datereturn.getTime()); 
         timestampcurrent.setNanos(0);
下面是代码,在当前日期的基础上增加2小时,以确定到期日期,并将其添加到时间戳中

//Set Expired Date/Time Based from xml Evaluation (Days)
            Calendar cal = Calendar.getInstance();
            cal.setTime(datereturn);
            cal.add(Calendar.DAY_OF_YEAR,Integer.parseInt(getServletContext().getInitParameter("EXPIRED_DAYS_EVALUATION"))); // this will add two hours
            expireddatereturn = cal.getTime();
            timestampexpired = new Timestamp(expireddatereturn.getTime());
            timestampexpired.setNanos(0);
            logText.info(timestampexpired   + "    " + timestampcurrent .toString());
所以我现在有两个时间戳,timestampcurrent(当前日期)和“timestampexpired(到期日期)

我试图将这些值插入oracle数据库,但收到错误:

                String sqlInsertData ="INSERT INTO EC_TABLE" +
                    "(licenseid, customername, description, servername,licensetype, username,password, createdDateTime,ExpiredDateTime)" +
                    " VALUES ('"+LicenseID+"','"+CustomerName+"','"+Description+"','"+ServerName+"','"+LicenseType+"','"+EncryptedUsername+"','"+EncryptedPassword+"','"+timestampcurrent+"','"+timestampexpired+"')";
错误为:ORA-01843:不是有效月份

几个小时来一直试图解决这个问题,但我找不到问题!。请帮忙

其他信息:

日志文本返回:

logText.info(timestampcurrent+“\”+timestampcurrent.toString())

信息[http-8080-2](ecsystem.java:233)-2013-11-20 15:34:55.0\2013-11-20 15:34:55.0

logText.info(timestampexpired+“\”+timestampexpired.toString())

信息[http-8080-2](ecsystem.java:233)-2013-11-22 15:34:55.0\2013-11-22 15:34:55.0


希望所有这些信息都有帮助

插入时可以使用以下命令

to_date('"+timestampcurrent+"', 'YYYY-DD-MM HH:MI:SS')

同样,对于timestampexpired,这应该可以解决这个问题。

您不应该使用字符串连接向查询添加动态参数,原因如下:

  • 用于日期、时间等的格式因数据库而异,甚至因语言环境而异。Java类型的toString()表示不一定与数据库所期望的匹配
  • 只要字符串中有一个引号或换行符,查询就会无效
  • 某些类型(如字节数组等)没有任何字符串表示
  • 这将打开您的应用程序
因此,您应使用:


看看这个[帖子][1]。这应该能回答你的问题。[1] :我想它应该是
cal.add(Calendar.HOUR,
。不要以这种方式组装SQL-使用PreparedStatement并让它执行格式化工作。“ORA-00947:值不够”错误,info语句返回到_日期('2013-11-20 16:14:55.0','yyyyy-DD-MM HH:MI:SS'),到_日期('2013-11-22 16:14:55.0','yyyyyy-DD-MM HH:SS'))是的,你也可以点击我发布到Java官方教程的链接,花10分钟阅读并完全理解准备好的语句的概念和用法ectly和我读了一篇关于你提到的安全问题的文章,我将通过链接更好地了解这一切。非常感谢你提供的信息。
String sql =
    "INSERT INTO EC_TABLE" +
    "(licenseid, customername, description, servername,licensetype, username,password, createdDateTime,ExpiredDateTime)" +
    " VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)";
PreparedStatement stmt = connection.prepareStatement(sql);
stmt.setString(1, licenseId);
...
stmt.setTimestamp(9, timestampexpired);