Oracle与Hypersonic SQL

时间:2009-05-29 16:34:01

标签: sql database oracle hsqldb

我需要在SQL查询中按日期选择,例如

SELECT * FROM foo WHERE date = '2009-09-09'

该查询适用于我的Hypersonic测试数据库,但不适用于Oracle,这似乎需要:

SELECT * FROM foo WHERE date = TO_DATE('2009-09-09', 'yyyy-mm-dd')

有没有办法在这两个数据库中统一选择日期?

5 个答案:

答案 0 :(得分:2)

我找到了答案 - 您可以在HyperSonic中创建TO_DATE函数,然后第二个查询在两者中都有效。例如,创建类:

public class Date {
    public static String toDate( String value, String format ) {
        return value;
    }
}

和查询

SELECT * FROM foo WHERE date = TO_DATE('2009-09-09', 'yyyy-mm-dd')

适用于两者。

答案 1 :(得分:1)

您可以尝试使用H2数据库作为内存数据库( http://www.h2database.com)。它应该有不错的Oracle compablity mode

答案 2 :(得分:1)

HSQLDB 2.0支持ANSI日期文字,就像Oracle一样。因此,如果您可以升级到HSQLDB 2.0,则可以使用:

SELECT * 
FROM foo 
WHERE date_column = DATE '2009-09-09'

在两个数据库中(实际上甚至还有更多的数据库)

答案 3 :(得分:0)

通常不建议使用Oracle中的“date ='文字字符串'”谓词 - 它对NLS_DATE_FORMAT设置很敏感,并且经常会导致对结果集中您要查找的内容产生误解(在上面的示例中,您想要吗?)当天的所有记录或仅在午夜创建的记录?)

如果您需要两个数据库的统一查询字符串,则可以在Oracle中重命名该表并创建名为foo的视图,并在视图逻辑中将date数据类型强制转换为varchar2。您可能需要向表中添加基于函数的索引,以便有效地搜索重铸值。

答案 4 :(得分:0)

如果可以,您可以在Oracle会话中设置NLS_DATE_FORMAT,这样您就不需要使用TO_DATE函数了,oracle会在幕后为您执行此操作。

SQL> select value from v$nls_parameters where parameter = 'NLS_DATE_FORMAT';

VALUE
----------------------------------------------------------------
DD/MM/YYYY

SQL> create table nls_date_test ( id number(10) , date_entered date );

Table created.

SQL> insert into nls_date_test values ( 1 , '31/05/2009' );

1 row created.

SQL> insert into nls_date_test values ( 2 , '30/05/2009' );

1 row created.

SQL> select * from nls_date_test where date_entered = '2009-09-09';
select * from nls_date_test where date_entered = '2009-09-09'
                                                  *
ERROR at line 1:
ORA-01861: literal does not match format string


SQL> alter session set nls_date_format = 'YYYY-MM-DD';

Session altered.

SQL> select * from nls_date_test where date_entered = '2009-05-30';

        ID DATE_ENTER
---------- ----------
         2 2009-05-30

SQL> select value from v$nls_parameters where parameter = 'NLS_DATE_FORMAT';

VALUE
----------------------------------------------------------------
YYYY-MM-DD

SQL>