HSQLDB 只是插入中的时间值

Posted

技术标签:

【中文标题】HSQLDB 只是插入中的时间值【英文标题】:HSQLDB just time value in insert 【发布时间】:2013-12-17 09:45:21 【问题描述】:

我们使用 HSQLDB for JUnits,我们的生产数据库是 Oracle。

我有一个表,其中有一个字段(类型是 Oracle 中的时间戳),其中包含有关一天中某个重要时间的信息。

我想在脚本中为 JUnit 准备测试数据,但失败了。

我在 Oracle DB 中可以做的基本思想是

SYSDATE - TRUNC(SYSDATE)

当我在 HSQLDB 中对 CURRENT_TIME 进行相同尝试时,出现错误:

org.hsqldb.HsqlException: incompatible data type in conversion

我得到的下一个想法是在“空日期”中添加时间,尝试过:

DATE '0000-01-01'

但是得到了

org.hsqldb.HsqlException: data exception: invalid datetime format

DATE '2013-01-01' 很奇怪,它工作正常,也许初始零是问题...不,它们不是,DATE '0-01-01' 也一样...

在这个阶段,我已经有点疯了(我想我可以在一秒钟内在 Oracle 中完成,我在这里花了几个小时)。

来自documentation 我试图找到一些创建所需结果的函数组合,但不幸的是我发现文档不清楚。初读时似乎如此,但尝试后我很惊讶为什么会这样

DATEADD( 'hour', 1, CURRENT_DATE )

工作正常,而

DATEADD( 'hour', 1, CURRENT_TIME)

结尾
org.hsqldb.HsqlException: incompatible data type in conversion

相反,DATE_ADD 对两者都有效,并且两个函数的参数类型在文档中是相同的:-/

我相信我能做到,比如

// 4x call of DATEADD, datetime not working as described above
date - years - months - days + seconds_from_midnight

但必须有一些易于使用的东西(我希望如此)。

HSQLDB 版本:2.3.1

【问题讨论】:

【参考方案1】:

将此设置用于您的测试:

SET DATABASE SQL SYNTAX ORA TRUE

然后这会起作用并返回一个 INTERVAL

SYSDATE - TRUNC(SYSDATE)

更简单的形式是CAST (SYSDATE AS TIME),用于返回SYSDATE的时间部分,您可以将其转换为时间间隔。

这个日期DATE '0000-01-01'不被接受,因为没有YEAR 0。你需要使用DATE '0001-01-01'

这可以很好地将一天中的时间转换为间隔:

LOCALTIME - TIME'00:00:00'

注意 LOCALTIME 没有时区,而 CURRENT_TIME 有。

【讨论】:

好的,在这种情况下,将语法设置为 ORA 是一个很好的解决方法。关于 0 年我被 Java 弄糊涂了,这里可以将 year 设置为 0。

以上是关于HSQLDB 只是插入中的时间值的主要内容,如果未能解决你的问题,请参考以下文章

HSQLDB 中的原子插入/选择

确保更新发生在 Hibernate/HSQLDB 中的并发锁定?

Hibernate Update 在 HSQLDB 中转换删除/插入

如果我在插入后重新启动识别器列,则脚本文件中的错误

条件插入作为 HSQLDB 1.8 中的单个数据库事务?

设置文本表 hsqldb Java