如何使用JDBC将日期时间添加到我的SQL数据库中

目前,我正在尝试从 JavaFX GUI 将我的日期时间添加到 SQL 中,但我不断收到数字格式异常错误。日期时间格式是yyyy-MM-dd HH:mm:ss,但我也可以像 12:30 等那样添加。

private void doAdd() {
    //Input from the user in GUI format
    int EntryID = Integer.valueOf(tfEntryID.getText());
    String PersonName = tfPersonName.getText();
    int CheckInTime = Integer.parseInt(tfCheckInTime.getText());
    String CheckTime = String.valueOf(CheckInTime);
    Date date = new Date(CheckInTime);
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") ;
    String currentDateTime = format.format(date);
    String insertSql = String.format("INSERT INTO entry_records(
        EntryID, PersonName, CheckTime) VALUES ('%s', '%s', %s)",
        EntryID , PersonName ,currentDateTime );
    int rowsAdded = DBUtil.execSQL(insertSql);
    if (rowsAdded == 1) {
        System.out.println("STATUS: ADD Entry Record (ID" + EntryID + ") Successful!");
    } else {
        System.out.println("Adding failed!");
    }
}

回答

永远不要使用DateSimpleDateFormat类。他们在设计上有很大的缺陷。它们在多年前被JSR 310 中定义的现代java.time类所取代。

对于 JDBC 4.2 及更高版本,您可以使用java.time对象与数据库交换日期时间对象。不需要字符串操作。

LocalDateTime如果您只有日期和时间并打算忽略时区,请将您的输入字符串解析为一个对象。

DateTimeFormatter f = DateTimeFormatter.ofPattern( … ) ;
LocalDateTime ldt = LocalDateTime.parse( input , f ) ;

使用 a 将该值写入数据库PreparedStatement以避免SQL 注入的安全风险。

myPreparedStatement.setObject( … , ldt ) ;

恢复。

LocalDateTime ldt = myResultSet.getObject( … , LocalDateTime.class ) ;

LocalDateTime类是合适的类型的类似于SQL标准的数据库列TIMESTAMP WITHOUT TIME ZONE。这些类型本质上是模棱两可的,因为它们都故意缺少时区或 UTC 偏移量的上下文。所以它们不能代表一个时刻,不是时间线上的一个特定点。

为了表示一个时刻,使用类Instant/ OffsetDateTime/ ZonedDateTime,与OffsetDateTime是适当的SQL交流。对于数据库列类型,使用类似于 SQL 标准的类型TIMESTAMP WITH TIME ZONE


所有这些已经在 Stack Overflow 上多次讨论过。搜索以了解更多信息。

  • 很好的答案。彼得,这一段有重要信息: *为了代表一个时刻,请使用……* 请至少阅读两遍。为了你的用户。

以上是如何使用JDBC将日期时间添加到我的SQL数据库中的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>