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.
有关更多信息,请参阅手册中有关自定义数据类型绑定的部分和强制类型。
反馈
您对此页面有任何反馈吗? 我们很乐意听取您的意见!