使用字符串变量将自定义日期和当前时间插入 Oracle 数据库

Posted

技术标签:

【中文标题】使用字符串变量将自定义日期和当前时间插入 Oracle 数据库【英文标题】:Inserting custom date and current time into Oracle database using string variables 【发布时间】:2012-03-08 22:41:12 【问题描述】:

所以我想做的是将自定义日期与当前时间一起设置为 Oracle 数据库中的 DATE 类型。 我以 mm/dd/yyyy 的形式从 textField 获取字符串

 String tdate = textDate.getText().trim();

为了简化细节,我们只需将 DATE 插入到一个小表中。

 Calendar calendar = Calendar.getInstance();                                
 int hour = calendar.get(Calendar.HOUR);
 int minute = calendar.get(Calendar.MINUTE);
 int second = calendar.get(Calendar.SECOND);
 String current_time = hour+":"+minute+":"+second;

现在我们将 tdate 作为日期字符串,将 current_time 作为当前时间。

将表定义为:

create table transaction(
              tranaction_num integer,
              time_of_transaction DATE);

现在在 jdbc 中

PreparedStatement pStmt = Conn.prepareStatement("insert into transaction values(?,?));
pStmt.setString(1, "1");
pStmt.setString(2, "to_date( '"+tdate+" "+current_time+"','mm/dd/yyyy hh24:mi:ss')");
pStmt.executeUpdate();

这给了我如下错误

 ORA-01858: a non-numeric character was found where a numeric was expected

我知道我做错了什么,但我已经尝试了很多方法来让它发挥作用。只要当前时间正常,我不介意以其他方式获取当前时间

任何帮助将不胜感激

【问题讨论】:

【参考方案1】:

您应该在将日期字符串交给数据库之前对其进行解析,并且您应该使用setInt()作为第一个参数而不是setString()

SimpleDateFormat parser = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");

Date date = parser.parse(tdate+" "+current_time);

String sqlStmt = "INSERT INTO transaction(tranaction_num, time_of_transaction) VALUES(?,?)";
PreparedStatement pStmt = Conn.prepareStatement(sqlStmt);
pStmt.setInt(1, 1);
pStmt.setDate(2, new java.sql.Date(date.getTime()));
pStmt.executeUpdate();

【讨论】:

嗯...数据库如何知道字段的排列方式?我的意思是,如果我的日期是 mm-dd-yyyy,那么数据库就无法知道它是这样安排的。我这样想对吗? 谢谢!现在好多了。 :-) 哦,我想我误会了。是的,如果tdate 包含与"MM/dd/yyy" 不同格式的日期,这将不起作用。 parser.parse() 会抛出异常。所以语句sqlStmt 不会被执行。【参考方案2】:

如果你想传递一个字符串,你可能想要类似的东西

String sqlStmt = "insert into transaction values(?,to_date(?,'mm/dd/yyyy hh24:mi:ss'))"
PreparedStatement pStmt = Conn.prepareStatement(sqlStmt);
pStmt.setString(1, "1");
pStmt.setString(2, tdate+" "+current_time);
pStmt.executeUpdate();

但是,从良好的编码角度来看,对第一个参数执行 setInt 并在第二个参数上执行 setDate 比将所有内容都作为字符串传递会更好。

【讨论】:

这确实将正确的值插入到必要的表中。为此非常感谢。但是当我以 SELECT * FROM 事务运行查询时;在 sql 命令行中。我只在 time_of_transaction 列中获得日期。我希望它显示日期和时间。 @RiteshAhuja - 在 SQL*Plus 中,您需要更改会话的 NLS_DATE_FORMAT 或者您需要在查询中使用显式的 TO_CHAR,即 select to_char( time_of_transaction, 'YYYY-MM-DD HH24:MI:SS' ) from transaction 非常感谢您的及时回复。你们真棒!我的代码可以运行了。【参考方案3】:

代替

pStmt.setString(1, "1");

用途:

pStmt.setInt(1, 1);

【讨论】:

你说得对,我本可以使用它,但这与我的问题无关。我只是为了它而编造了一些东西。尽管如此,传递字符串也同样有效。

以上是关于使用字符串变量将自定义日期和当前时间插入 Oracle 数据库的主要内容,如果未能解决你的问题,请参考以下文章

我正在尝试将自定义日期传递给 PayPal

C# 使用DateTime.TryParseExact将自定义日期类型转换成日期

使用 java 和 sql INSERT Query 在 MS 访问中插入字符串类型变量和日期类型变量

将自定义数据属性插入 JQuery DataTables

可以将自定义信息插入 GridView 寻呼机吗?

将自定义变量传递给 Formstone