不同数据库引擎之间的原生查询日期格式

Posted

技术标签:

【中文标题】不同数据库引擎之间的原生查询日期格式【英文标题】:Native Query date formats between different database engines 【发布时间】:2019-05-20 17:13:20 【问题描述】:

我正在使用以下代码为 Hibernate 创建本机查询

    final Query countQuery = entityManager.createNativeQuery( countSql );

    if ( countCriteria.getStartDate() != null ) 
        final String startDate = countCriteria.getStartDate().toString();
        countQuery.setParameter( START_DATE_PARAMETER, startDate );
    

我班级的 startDate 是 org.joda.time.DateTimetoString() 返回“2019-05-13”。

这些查询参数在针对 MS Sql Server 运行的生产环境中运行良好。 (恶心!)

现在,单元测试正在针对 HSQLDB 运行。我提供了相同的值,它会抛出:

javax.persistence.PersistenceException: org.hibernate.exception.DataException: data exception: invalid datetime format

当它尝试运行查询时。

由于参数的格式完全相同,我假设问题在于 HSQLDB 的日期字符串的格式。

那么,现在呢?我该如何继续前进?我已经检查了采用 TEMPORAL 或其他格式的 setParameter 格式,但这不适用于 JODA 时间。

我已经与我的技术主管讨论过不使用本机查询,而是使用休眠查询,但我对此置若罔闻。我是否还有其他选择,这样我就不必与我的技术主管为我们的 DAO 编写单元测试了?

【问题讨论】:

可能的重复/解决方案....***.com/questions/33700721/… @WEI_DBA,不,我找到了那个。这只适用于甲骨文。 MS SQL Server 没有实现 TO_DATE 函数,而是使用它的自定义版本。所以,那个解决方案对我不起作用。 @WEI_DBA,当然,除非你看到了我没有看到的东西。 好的。谢谢..我不熟悉hibernate。只是想帮忙。但是,如果它正在寻找时间,请在时间格式中插入 0 以查看是否可以通过。 HSQLDB 2.4.x 需要一个 java.time 对象。以前的版本需要一个 java.sql 对象。字符串被转换为 java 对象,但它需要小时:分钟:秒部分以及日期部分。 【参考方案1】:

好吧,我很尴尬地承认我花了多长时间才弄清楚这一点。

我只是将 LocalDate 转换为 java 日期,然后用它来设置 TemporalType 参数。

    Date date = localDate.toDate();
    countQuery.setParameter(parmName, date, TemporalType.DATE);

这似乎工作正常。

【讨论】:

以上是关于不同数据库引擎之间的原生查询日期格式的主要内容,如果未能解决你的问题,请参考以下文章

存储引擎数据类型约束条件

mysql表操作

mysql表操作

ETL 选择,构建一个直接处理 SQL 查询引擎(impala)或原生数据库的 ETL? [关闭]

分区,引导,左连接。不同线数据时间的差异-s

全方位测评HiveSparkSQLPresto 等七个大数据查询引擎,最快的竟是……| 程序员硬核测评