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