【问题标题】:Using sql.date to update DATE field in database with Java使用 sql.date 使用 Java 更新数据库中的 DATE 字段
【发布时间】:2022-02-03 03:56:15
【问题描述】:

我正在尝试更新元组中的 endDate,它是 DATE 类型。我已经通过 Java 正确连接到数据库,并且能够运行其他查询。我是 100% 我使用的是 sql.date 类而不是 util.date。但是,它仍然无法满足我在表格行上设置的约束。即:

CHECK(JulianDay(startDate) <= JulianDay(endDate))

我很确定问题与我尝试更新日期的格式有关。请参阅 main 方法中的 1 行。这是代码的sn-p:

public static void main(String[] args) {
    updateProjectDeadline(1000, new Date(2026-11-31));
}

private static void updateProjectDeadline(int projectID, Date endDate) {
    Connection con = JDBCLogic.connect();
    PreparedStatement prepared;
    try {
        String sql = "UPDATE Project SET endDate = ? WHERE projectID = ?";
        prepared = con.prepareStatement(sql);
        prepared.setDate(1, endDate);
        prepared.setInt(2, projectID);
        prepared.execute();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

如果我将日期作为字符串对象插入,则该方法可以完美运行,但是,约束基本上可以接受任何内容。所以我想让它与 sql.date 对象一起工作。

我通过输入 new Date(System.currentTimeMillis) 使其工作,但是,这会在数据库中以毫秒为单位输入日期,我需要格式为 yyyy/mm/dd。

【问题讨论】:

  • 没有日期“2026-11-31”。

标签: java sqlite date


【解决方案1】:

YYYY-MM-DD 以外的任何文本日期时间格式在与 SQLite 的日期时间函数一起使用时都是无用的。
这使您的检查约束也无用。
您可以通过执行自行检查:

SELECT julianday('2022/02/02');

结果是NULL,但是:

SELECT julianday('2022-02-02');

返回正确的结果。

因此,首先将表中 2 个日期列的现有值更新为正确的格式:

UPDATE Project 
SET startdate = REPLACE(startdate, '/', '-')
    endDate = REPLACE(endDate, '/', '-');

此外,检查约束可以简化为:

CHECK(startDate <= endDate)

【讨论】:

    【解决方案2】:

    数字字面量

    一个问题是你的代码:

    new Date(2026-11-31)
    

    ... 将 1,984 传递给 Date 的构造函数。也就是说,您正在使用带有减号的数字文字来进行数学运算。 2026 减 11 减 31 等于 1984。

    您正在将该数字传递给一个构造函数,该构造函数在 UTC 中 1970 年第一刻的纪元参考点以来的毫秒数中获取一个数字。

    java.time

    纵观全局,另一个问题是您使用的糟糕日期时间类在几年前被现代java.time类所取代。 Sun、Oracle 和 JCP 社区放弃了这些课程。我建议你也这样做。

    对于仅日期值,将LocalDate 与支持 JDBC 4.2 或更高版本的 JDBC 驱动程序一起使用。

    而且,as commented,您的预定日期无效。没有 11 月 31 日。我会用 30 号代替。

    LocalDate ld = LocalDate.parse( "2026-11-30" ) ;
    myPreparedStatement.setObject( … , ld ) ;
    

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

    【讨论】:

    • 您好,感谢您的好评!使用 LocalDate 效果更好,并且完美地将其解析到数据库中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-31
    • 2013-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多