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

HSQLDB:使用java插入/获取日期,java,sql,date,calendar,hsqldb,Java,Sql,Date,Calendar,Hsqldb,我正在使用HSQLDB制作一个小程序(使用JavaFXGUI),目前我正在尝试让“预订”部分工作(用户可以在限定的时间内添加新的预订或搜索现有的预订)。 为此,我已经提前添加了一些日期(我使用的是database.sql脚本),例如: 我已经写了一些方法(创建、更新、删除、搜索、findAll),现在我被困在“创建”部分 我想在DB中插入新的预订,并使用 pstmt = con.prepareStatement("INSERT INTO reservations(begin, end) VALU

我正在使用HSQLDB制作一个小程序(使用JavaFXGUI),目前我正在尝试让“预订”部分工作(用户可以在限定的时间内添加新的预订或搜索现有的预订)。 为此,我已经提前添加了一些日期(我使用的是database.sql脚本),例如:

我已经写了一些方法(创建、更新、删除、搜索、findAll),现在我被困在“创建”部分

我想在DB中插入新的预订,并使用

pstmt = con.prepareStatement("INSERT INTO reservations(begin, end) VALUES (?,?)");
但我在创建可以插入的新日期时遇到问题

pstmt.setDate(1, (java.sql.Date) beg);
不起作用(我使用java.util.Date对象保存从数据库导出的日期),它只是中止测试(jUnit)

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

但是(我不知道日期在HSQLDB中到底是如何保存的)我希望日期是“YYYY-MM-DD”

那么,将日历日期转换为我需要的格式(并对其进行分类?不幸的是,将字符串转换为日期不起作用)的最佳方法是什么呢。并且:如果我打算使用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

如果在值子句中使用字符串,则可以考虑日期。您的语句“仅以:Wed Jan 01 12:23:15 CET 2014的形式创建日期”并不重要,因为您只看到

java.util.Date的
toString()方法的输出。它与内部状态或数据库中的存储无关。您的愿望“我希望日期为”YYYY-MM-DD“。与应用程序的表示层相关,而不是与db的内部存储格式相关,您除了选择适当的db列类型(此处:ANSI-SQL-date)之外无法控制db的内部存储格式

在表示层中,您可以使用带有模式“yyyy-MM-dd”的类,如
SimpleDateFormat
,以获得所需的输出

编辑(因为评论中有问题):

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

此外,对于数据库工具如何显示日期列值,您没有真正的控制权。这就是你使用的工具的秘密。数据库内部的状态可能非常不同,因此每个数据库都像一个黑匣子


但是,当您从db中读取日期值并将数据准确地呈现给用户时,您必须担心
java.util.date
-对象的表示。为此,我建议使用
SimpleDateFormat
——见上文。但这种适应(转换为可读的人工日期格式)不在db工具中,也不在JDBC层中,而只在用户表示层中,通常在UI中。

No,我在den db中使用日期:“创建表保留(默认情况下生成的剩余整数作为标识主键,开始日期不为NULL,结束日期不为NULL)”。。。。。。。。。。。。。。。。。。我将使用JavaFX场景生成器来制作布局,我只想让它与日历下拉列表一起工作(这样用户就可以选择他们想要搜索的时段)。您认为:使用java.util.Date并将其强制转换为java.sql.Date更好,还是应该从一开始就使用后一个呢?@Neph在我所写的内容中,对db使用
java.sql.Date
(在
PreparedStatement
中),但不要使用类型强制转换@Neph您只能在JDBC层中使用
java.sql.Date
,该层是
PreparedStatement
中的参数。在外部,您可以使用<代码> java .UTI.DATE < /C>(虽然我认为它是坏的,但这是另一个主题)。再说一次:不要强制转换,而是包装。关于外观的事情是:如果我在java.sql.Date上使用logger.info()(应该来自log4j),它输出“2014-01-01”,另一方面,java.util.Date输出整个内容,包括一天的名称、小时、分钟和秒,因为我必须比较所选的日期和数据库中的日期(使用java.util.Date中的a.before(b),我担心它不会起作用,因为java版本似乎保存了更多的信息。是的,我想以“YYYY-MM-DD”格式在一个表中输出所有保留,并在它们自己的列中使用begin/end(我正在创建它的实例,例如测试类和服务类)应该是java.sql.dates,在将a和b提交给“search”方法之前,我应该将它们包装在例如测试类中,使用java.sql.Date a=new java.sql.Date(a1),a1是Date a1=cal1.getTime();对吗?我现在遇到另一个问题:a.equals(b)不会返回“true”….a是“Date a=new java.sql.Date(r.getBegin().getTime());”而r是保留的新实例…….b是“b=rs.getDate(“begin”);(使用带有“SELECT begin,end FROM reservation”的语句和结果集rs.….它应该返回“true”,因为我第一次创建了r,将它提交给DB(它工作得很好)然后将其与“find(r)”一起使用,但仍然没有,因此日期必须存在问题(已检查,“find”方法适用于除日期之外的所有内容):/(至少今天是同一天),所以我想这是因为日历的缘故吧?难道没有一种方法可以
Calendar cal1 = Calendar.getInstance();
cal1.set(2014, 0, 1);
Date beginn = cal1.getTime();
new java.sql.Date(beg.getTime()); // provided beg is of type java.util.Date as you wrote