HSQLDB:使用java插入/获取日期

时间:2014-03-25 11:28:32

标签: java sql date calendar hsqldb

我使用HSQLDB制作一个小程序(使用JavaFX gui),而我目前正试图获得"预订"部分工作(用户可以添加新的或在有限的时间内搜索现有的)。 为此,我已事先添加了几个日期(我使用的是database.sql脚本),例如:

INSERT INTO reservations(begin, end) VALUES ('2013-08-01', '2013-08-31')

我已经写了一些方法(创建,更新,删除,搜索,查找全部),现在我已经陷入了"创建"一部分。

我想用

将新的预订插入数据库
pstmt = con.prepareStatement("INSERT INTO reservations(begin, end) VALUES (?,?)");

但是我在创建可以插入的新日期时遇到了问题。

pstmt.setDate(1, (java.sql.Date) beg);

不能工作(我使用java.util.Date对象来保存数据库中的导出日期),它只是中止我的测试(jUnit)。

Calendar cal1 = Calendar.getInstance();
cal1.set(2014, 0, 1);
Date beginn = cal1.getTime();

仅以下列形式创建日期:Wed Jan 01 12:23:15 CET 2014

但是(而且我不知道HSQLDB中保存的确切日期)我希望日期为" YYYY-MM-DD"。

那么,将日历日期转换为我需要的格式的最佳方法是什么(并且将它们加以分类?不幸的是,将字符串转换为日期并不起作用)。并且:如果我要使用JavaFX让用户选择开始和结束日期,我使用java.util.Date的方法是否正常?

1 个答案:

答案 0 :(得分:1)

而不是(java.sql.Date) beg导致ClassCastException,你应该写:

new java.sql.Date(beg.getTime()); // provided beg is of type java.util.Date as you wrote

如果您在VALUES子句中使用字符串,则可能会考虑JDBC-escape-syntax表示日期。您的陈述"仅以以下形式创建日期:Wed Jan 01 12:23:15 CET 2014"完全无关紧要,因为您只看到toString()的方法java.util.Date的输出。它与db中的内部状态或存储无关。您的愿望"我希望日期为" YYYY-MM-DD"。"与您的应用程序的表示层相关,而不是与您无法控制的db的内部存储格式相关,除了选择适当的db列类型(此处:ANSI-SQL-DATE)。

在表示层中,您可以使用类似SimpleDateFormat的类和模式" yyyy-MM-dd"为你想要的输出。

编辑(由于评论中的问题):

好的,你真的不必担心toString() - java.util.Date - 时间戳的表示。它的内部状态只是一个很长的代表自1970-01-01以来经过的毫秒数不计算闰秒。只需忽略java.util.Date的标准输出,它会显示系统区域上下文,而不是内部状态。使用a.before(b)非常合适,与toString()的奇怪输出无关 - java.util.Date的方法。

此外:您无法真正控制数据库工具如何显示日期列值。这是您使用的工具的秘密。 db中的内部状态可能完全不同,因此每个db都像一个黑盒子。

但是当您从db读取日期值并将数据呈现给用户时,您必须担心java.util.Date - 对象的表示。为此,我建议使用SimpleDateFormat - 见上文。但是这种改编(转换为可读的人类日期格式)不是在db-tool中,不在JDBC层中,而是仅在用户表示层中,通常在UI中。

相关问题