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 只是插入中的时间值的主要内容,如果未能解决你的问题,请参考以下文章
确保更新发生在 Hibernate/HSQLDB 中的并发锁定?