为什么CURRENT_DATE包含Oracle模式中的时间?

时间:2014-01-31 09:42:27

标签: oracle hsqldb

当我连接到

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会这样表现? 有没有办法禁用自动转换?

1 个答案:

答案 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“包含日期时间字段YEARMONTHDAYHOURMINUTESECOND ”。所以它等同于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)