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

标签 java sql date calendar hsqldb

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

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

我已经编写了一些方法(创建、更新、删除、搜索、findAll),现在我有点停留在“创建”部分。

我想将新的预订插入数据库

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 日期的方法可以吗?

最佳答案

您应该编写以下内容,而不是导致 (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”根本不重要,因为您只看到 java.util.Date 的方法 toString() 的输出。它与数据库中的内部状态或存储无关。您的愿望“我希望日期为“YYYY-MM-DD”。”与应用程序的表示层相当相关,而不是与数据库的内部存储格式相关,除了选择适当的数据库列类型(此处:ANSI-SQL-DATE)之外,您无法控制数据库的内部存储格式。

在表示层中,您可以使用 SimpleDateFormat 等带有模式“yyyy-MM-dd”的类来获得您想要的输出。

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

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

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

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

关于java - HSQLDB:使用 java 插入/获取日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22633195/

相关文章:

mysql - 如何查询 2 个 SQL 表并使用 1 个查询更改数据

php - 一次将 mysql 转换为 pdo 一个脚本

php - 如何在 Laravel 中将时间作为输入?

excel - 从特定日期计算 12 个月前的日期

java - Java 中的日期选择

ios - 日期组件今天和明天两个日期之间的日差错误

javax.smartcardio - javadocs

java - 用于删除从文本字段中获取的值的 SQL 命令

java - 何时选择 @RequestParam 而不是 @PathVariable,反之亦然?

java - OpenGL glTranslatef 和 glScalef