我们正在使用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
答案 0 :(得分:2)
将此设置用于测试:
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'
这可以很好地将当天的时间转换为INTERVAL:
LOCALTIME - TIME'00:00:00'
注意LOCALTIME没有时区,而CURRENT_TIME有。