我正在使用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.Date
的toString()
方法的输出。它与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.Date
的toString()
方法的奇怪输出无关。
此外:您无法真正控制数据库工具如何显示日期列值。这就是你所使用的工具的秘密。db内部的状态可能会有很大的不同,所以每个db就像一个黑盒子。
但是,当您从db中读取日期值并将数据呈现给用户时,您必须担心java.util.Date
-对象的表示。出于这个目的,我建议使用SimpleDateFormat
—参见上面。但是这种适应(转换为可读的人类日期格式)不在db-tool中,不在jdbc层中,而只在用户表示层中,通常在UI中。