java - 如何处理 Jooq 中的日期?

标签 java sql jooq

当我们使用普通 JDBC 连接时,我们使用下面的代码来格式化日期或转换日期

 if(argDB.equals("Oracle")){
       sb.append(" AND TO_CHAR(PaymentDate, 'YYYY-MM-DD') <= TO_CHAR(SYSDATE,'YYYY-MM-DD')");
          }
 else {
       sb.append(" AND CONVERT(VARCHAR(8), PaymentDate, 112) <= CONVERT(varchar(8), dbo.getdate(), 112)");
           }

现在我们正在使用 JOOQ 您是否认为我们必须像以前那样转换日期,或者 JOOQ 可以在内部处理此类问题。?正如我现在检查的那样,JOOQ 不支持 Oracle 和 Lukas 的 TO_CHAR 方法给出了这个 Here 的一些替代方法

最佳答案

编写谓词的更好方法

由于您格式化日期只是为了比较它们,您可能应该只比较日期值本身,这会更快,因为您的数据库将能够使用索引:

-- In SQL
ACCOUNT_PAYMENT.PAYMENT_DATE <= SYSDATE
// In jOOQ
ACCOUNT_PAYMENT.PAYMENT_DATE.le(DSL.currentDate())

实现独立于方言的自定义 TO_CHAR() 函数。

你应该创建一个 CustomField以此目的。这将允许您与 jOOQ 的查询呈现和变量绑定(bind)生命周期进行交互,以便根据 RenderContext 呈现 SQL 方言特定的子句。的标的SQLDialect .本质上这归结为写作(假设 jOOQ 3.2 API):

class ToChar extends CustomField<String> {
    final Field<?> arg0;
    final Field<?> arg1;
    ToChar(Field<?> arg0, Field<?> arg1) {
        super("to_char", SQLDataType.VARCHAR);
        this.arg0 = arg0;
        this.arg1 = arg1;
    }
    @Override
    public void toSQL(RenderContext context) {
        context.visit(delegate(context.configuration()));
    }
    @Override
    public void bind(BindContext context) {
        context.visit(delegate(context.configuration()));
    }
    private QueryPart delegate(Configuration configuration) {
        switch (configuration.dialect().family()) {
            case ORACLE:
                return DSL.field("TO_CHAR({0}, {1})", 
                    String.class, arg0, arg1);

            case SQLSERVER:
                return DSL.field("CONVERT(VARCHAR(8), {0}, {1})", 
                    String.class, arg0, arg1);

            default:
                throw new UnsupportedOperationException("Dialect not supported");
        }
    }
}

然后,您可以编写自己的静态实用程序方法:

public class MyDSL {
    public static Field<String> toChar(Field<?> field, String format) {
        return new ToChar(field, DSL.inline(format));
    }
}

关于java - 如何处理 Jooq 中的日期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19900022/

相关文章:

sql - T-SQL 返回单个值而不是累积值

mysql - sql不使用upper或lower函数不区分大小写查询

sql - 使用 MySQL IN 子句作为全包(AND 而不是 OR)

postgresql - jOOQ:只获得一个结果而不是所有现有条目

java - Spring JOOQ 生成部分失败

c# - Java 到 C# : Extends in Generic

java - Activity 和 Fragment 之间的通信以发送值

java - 如何在 setText 中将 api 中的数据作为数组传递

java - jOOQ 将字符串转换为 boolean 值

java - Java 中的内部 block 如何访问应该超出范围的局部变量? (JVM 如何处理 Java 中的最终局部变量)