当前位置: 首页 > 知识库问答 >
问题:

在SQLite中使用DATETIME列时,如何避免NumberFormatException?

耿运浩
2023-03-14

我使用的是一个包含DATETIME列的SQLite数据库。jOOQ default将日期时间列绑定到java。sql。时间戳。查询包含DATETIME列的表会导致每列出现NumberFormatException(已处理)。

我使用jOOQ 3.11.9。

异常在组织中抛出。约克。impl。默认绑定。DefaultTimestampBindingparse方法,当它第一次尝试将时间戳字符串值转换为数字时。

private static final long parse(Class < ? extends java.util.Date > type, String date) throws SQLException {

    // Try reading a plain number first
    try {
        return Long.valueOf(date);
    }

    // If that fails, try reading a formatted date
    catch (NumberFormatException e) {

        // [#7325] In SQLite dates could be stored in both ISO standard formats:
        //         With T (default standard), or without T (optional standard, JDBC standard)
        date = StringUtils.replace(date, "T", " ");

        if (type == Timestamp.class)
            return Timestamp.valueOf(date).getTime();

        // Dates may come with " 00:00:00". This is safely trimming time information
        else if (type == Date.class)
            return Date.valueOf(date.split(" ")[0]).getTime();

        else if (type == Time.class)
            return Time.valueOf(date).getTime();

        throw new SQLException("Could not parse date " + date, e);
    }
}

查看get0set0DefaultTimestampBinding方法时,时间戳总是get/set为String。为什么SQLite没有作为时间戳传递给JDBC语句/结果?有没有办法覆盖此行为或避免异常?

Override
final void set0(BindingSetStatementContext < U > ctx, Timestamp value) throws SQLException {
    if (ctx.family() == SQLITE)
        ctx.statement().setString(ctx.index(), value.toString());
    else
        ctx.statement().setTimestamp(ctx.index(), value);
}

@Override
final Timestamp get0(BindingGetResultSetContext < U > ctx) throws SQLException {

    // SQLite's type affinity needs special care...
    if (ctx.family() == SQLDialect.SQLITE) {
        String timestamp = ctx.resultSet().getString(ctx.index());
        return timestamp == null ? null : new Timestamp(parse(Timestamp.class, timestamp));
    } else {
        return ctx.resultSet().getTimestamp(ctx.index());
    }
}

共有1个答案

姜天宇
2023-03-14

虽然您可以向代码生成器注册自定义绑定,但请注意,这个问题将在即将发布的jOOQ 3.12版本以及下一个3.11服务版本中解决。详见https://github.com/jOOQ/jOOQ/issues/8736。

 类似资料:
  • 问题内容: 我有一张桌子,桌子上有个日期 creationDate 。像这样存储时间戳 实际上,我正在使用mysql2sqlite.sh脚本将数据库从mysql转换为sqlite。并且在转换数据库时,它从creationDate列中减少了5:30的时间。这可能是 格林尼治标准时间的 问题。 因此,现在我想更新时间戳,并向creationDate列中的每个条目添加5小时30分钟。 我搜索了很多,但没

  • 问题内容: 现在,我正在尝试对汇编程序进行编码,但我不断收到此错误: 我目前有以下代码: 感谢帮助。 问题答案: 您通常使用默认值 如果key在字典中,则返回key的值,否则返回默认值。如果未提供default,则默认为None,因此此方法永远不会引发KeyError。 因此,当您使用循环时,将如下所示: 打印: 如果要显式检查键是否在字典中,则必须检查键是否在字典中(无索引!)。 例如: 但是该

  • 我听说过很多关于在Excel VBA中使用的憎恶是可以理解的,但我不确定如何避免使用它。我发现,如果我能够使用变量而不是函数,那么我的代码将更加可重用。但是,如果不使用,我不确定如何引用东西(如等)。 我已经找到了这篇关于范围的文章和这个关于不使用select的好处的例子,但是我找不到任何关于如何使用的东西。

  • 问题内容: 我正在编写一个基于PHP的Web应用程序,该应用程序可以与多个数据库系统一起使用。最重要的是MySQL和SQLite,但是PostgreSQL和其他也不错。为此,我尝试使用尽可能可移植的SQL。在无法做到这一点的地方,我在查询中定义了一些元数据,这些元数据由数据库层处理,并转换为特定于平台的SQL命令。 我现在正在尝试添加序列支持。每个DBMS处理序列的方式都不同,没有通用的方法可以用

  • 问题内容: 建议在HTML页面中使用表格(现在已经有了CSS)? 表格有什么用途?表具有哪些CSS所没有的功能? 问题答案: 一点都不。但是将表格用于表格数据。只是不要将它们用于一般布局。 但是,如果您显示表格数据(例如结果或什至是表格),请继续使用表格!

  • 从我的main开始,我将启动两个线程,称为producer和consumer。两者都包含循环。生产者循环是UDP服务器,因此不需要Hibernate。我的问题出在消费者方面。使用者循环将对象从链接队列中移除,并将其传递给一个函数进行进一步处理。根据研究,在循环中使用线程Hibernate不是一个好的实践,因为有时O/S在设定时间结束时不会释放。如果我删除线程Hibernate,当应用程序是理想的,