HSQLDB:用java插入/获取日期



我正在使用HSQLDB来制作一个小程序(使用JavaFX gui),我目前正试图让"保留"部分工作(用户可以添加新的或在有限的时间内搜索现有的)。为此,我已经事先添加了一些日期(我使用数据库)。SQL脚本),例如:

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

我已经写了一些方法(创建,更新,删除,搜索,findAll),现在我有点困在"创建"部分。

我想用

在DB中插入新的预订
pstmt = con.prepareStatement("INSERT INTO reservations(begin, end) VALUES (?,?)");

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

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

不工作(我使用java.util.Date对象来保存从DB导出的日期),它只是中止我的测试(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"。

那么,将日历日期转换成我需要的格式(并对其进行分类)的最佳方法是什么呢?不幸的是,将String强制转换为Date不起作用)。如果我要使用JavaFX让用户选择开始和结束日期,我使用java.util.Date日期的方法是否可行?

代替(java.sql.Date) beg导致ClassCastException,你应该写:

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

如果在VALUES-clause子句中使用字符串,则可以考虑使用jdbc转义语法表示日期。你的语句"只创建日期的形式为:Wed Jan 01 12:23:15 CET 2014"根本不重要,因为你只看到java.util.DatetoString()方法的输出。它与db中的内部状态或存储无关。你的愿望"我希望日期是"YYYY-MM-DD"."与应用程序的表示层相当相关,而不是与数据库的内部存储格式相关,除了选择适当的数据库列类型(这里:ANSI-SQL-DATE)之外,你无法控制db的内部存储格式。

在表示层,你可以使用像SimpleDateFormat这样的类,模式为"yyyy-MM-dd"。

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

好吧,你真的不需要担心java.util.Date -时间戳的toString() -表示。它的内部状态只是一个表示自1970-01-01以来经过的毫秒数(不包括闰秒)的long。只需忽略java.util.Date的标准输出,它显示的是系统区域上下文,而不是内部状态。使用a.before(b)是完全可以的,并且与java.util.DatetoString()方法的奇怪输出无关。

此外:您无法真正控制数据库工具如何显示日期列值。这就是你所使用的工具的秘密。db内部的状态可能会有很大的不同,所以每个db就像一个黑盒子。

但是,当您从db中读取日期值并将数据呈现给用户时,您必须担心java.util.Date -对象的表示。出于这个目的,我建议使用SimpleDateFormat—参见上面。但是这种适应(转换为可读的人类日期格式)不在db-tool中,不在jdbc层中,而只在用户表示层中,通常在UI中。

最新更新