【问题标题】:HSQLDB just time value in insertHSQLDB 只是插入中的时间值
【发布时间】: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

【问题讨论】:

    标签: hsqldb


    【解决方案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。
    猜你喜欢
    • 2013-01-11
    • 1970-01-01
    • 2021-03-22
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    • 2017-09-26
    • 2020-12-22
    • 2019-01-27
    相关资源
    最近更新 更多