Oracle DATE 数据类型
适用于 ✅ 开源版 ✅ 专业版 ✅ 企业版
Oracle 的 DATE 数据类型不符合 SQL 标准。它实际上是 TIMESTAMP(0),即小数秒精度为零的 TIMESTAMP。Oracle DATE 类型最合适的 JDBC 类型是 java.sql.Timestamp。
性能影响
当将 TIMESTAMP 变量绑定到 SQL 语句时,与其将这些变量截断为 DATE,基于成本的优化器可能会选择使用 Oracle INTERNAL_FUNCTION() 将数据库列从 DATE 扩展到 TIMESTAMP,这会阻止索引的使用。 有关此行为的详细信息,请参见此 Stack Overflow 问题。
使用数据类型绑定来解决此问题
解决此问题的最佳方法是实现自定义数据类型绑定,该绑定为每个绑定变量生成 CAST 表达式
@Override
public final void sql(BindingSQLContext<Timestamp> ctx) throws SQLException {
ctx.render()
.visit(keyword("cast")).sql('(')
.visit(val(ctx.value())).sql(' ')
.visit(keyword("as date")).sql(')');
}
已弃用的功能
jOOQ 的历史版本曾经支持 <dateAsTimestamp/> 标志,该标志可以与现成的 org.jooq.impl.DateAsTimestampBinding 一起用作 自定义数据类型绑定
XML(独立和 Maven)
编程方式
Gradle (Kotlin)
Gradle (Groovy)
Gradle(第三方)
<configuration>
<generator>
<database>
<!-- Use this flag to force DATE columns to be of type TIMESTAMP. This has been deprecated. -->
<dateAsTimestamp>true</dateAsTimestamp>
<!-- Define a custom binding for such DATE as TIMESTAMP columns -->
<forcedTypes>
<forcedType>
<name>TIMESTAMP</name>
<userType>java.sql.Timestamp</userType>
<binding>org.jooq.impl.DateAsTimestampBinding</binding>
<includeTypes>DATE</includeTypes>
</forcedType>
</forcedTypes>
</database>
</generator>
</configuration>
有关更多详细信息,请参见 配置 XSD、独立代码生成和maven 代码生成。
new org.jooq.meta.jaxb.Configuration()
.withGenerator(new Generator()
.withDatabase(new Database()
// Use this flag to force DATE columns to be of type TIMESTAMP. This has been deprecated.
.withDateAsTimestamp(true)
// Define a custom binding for such DATE as TIMESTAMP columns
.withForcedTypes(
new ForcedType()
.withName("TIMESTAMP")
.withUserType("java.sql.Timestamp")
.withBinding("org.jooq.impl.DateAsTimestampBinding")
.withIncludeTypes("DATE")
)
)
)
import org.jooq.meta.jaxb.*
configuration {
generator {
database {
// Use this flag to force DATE columns to be of type TIMESTAMP. This has been deprecated.
isDateAsTimestamp = true
// Define a custom binding for such DATE as TIMESTAMP columns
forcedTypes {
forcedType {
name = "TIMESTAMP"
userType = "java.sql.Timestamp"
binding = "org.jooq.impl.DateAsTimestampBinding"
includeTypes = "DATE"
}
}
}
}
}
有关更多详细信息,请参见 配置 XSD 和 gradle 代码生成。
configuration {
generator {
database {
// Use this flag to force DATE columns to be of type TIMESTAMP. This has been deprecated.
dateAsTimestamp = true
// Define a custom binding for such DATE as TIMESTAMP columns
forcedTypes {
forcedType {
name = "TIMESTAMP"
userType = "java.sql.Timestamp"
binding = "org.jooq.impl.DateAsTimestampBinding"
includeTypes = "DATE"
}
}
}
}
}
有关更多详细信息,请参见 配置 XSD 和 gradle 代码生成。
// The jOOQ-codegen-gradle plugin has been introduced in version 3.19. // Please use the official plugin instead of the third party plugin that was recommended before.
有关更多信息,请参阅手册中有关自定义数据类型绑定的部分和强制类型。
反馈
您对此页面有任何反馈吗? 我们很乐意听取您的意见!