当我连接到
时jdbc:hsqldb:mem:lbw;sql.syntax_ora=true
声明
SELECT CURRENT_DATE FROM dual
结果
2014-01-31 10:35:54
这与没有Oracle语法模式的连接相反,其中CURRENT_DATE
不包含时间。
如HSQLDB documentation中所述,DATE
在Oracle语法模式下被解释为TIMESTAMP(0)
。但是在Oracle 10g本身中,CURRENT_DATE
表现得如预期的那样(没有时间)。
这种差异似乎通常包括DATE
个字段。
为什么HSQLDB会这样表现? 有没有办法禁用自动转换?
答案 0 :(得分:3)
来自same HSQLDB documentation you linked to:
日期时间类型
HSQLDB完全支持日期时间和间隔类型和操作, 包括SQL指定的所有相关可选功能 自SQL-92以来的标准。这两类类型是互补的。
DATE类型表示YEAR,MONTH和DAY的日历日期 字段。
TIME类型表示HOUR,MINUTE和SECOND的时间 字段,以及可选的SECOND FRACTION字段。
TIMESTAMP类型表示DATE和TIME类型的组合。
Oracle compatibility section说:
- 在ORA语法模式下,DATE类型被解释为TIMESTAMP(0)。
Oracle的DATE
data type“包含日期时间字段YEAR
,MONTH
,DAY
,HOUR
,MINUTE
和SECOND
”。所以它等同于HSQLDB TIMESTAMP(0)
数据类型,并且在Oracle模式下它被视为这样。
Oracle日期总是有一个时间组件,即使它在午夜全部为零。如果你的SQL客户端默认没有显示它,你可以看到select to_char(current_date, 'YYYY-MM-DD HH24:MI:SS')
,正如其他人已经指出的那样。
在正常的非Oracle模式下,HSQLDB只是将值视为SQL标准DATE
并删除时间部分;在Oracle模式下,它保留了时间。似乎没有任何方法可以选择性地启用Oracle模式的某些方面,因此您会遇到时间 - 实际上不确定为什么这是一个问题,因为它只是反映了您在数据库中的数据。如果你想忽略你总是select trunc(current_date)
的时间,这将花费时间回到午夜;但它仍会显示为2014-01-31 00:00:00
,因为它仍将被视为TIMESTAMP(0)
。