0

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

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

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

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

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

4

5 回答 5

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')

两者都适用。

于 2009-05-29T17:28:34.940 回答
1

您可以尝试将 H2 数据库作为您的内存数据库(http://www.h2database.com)。它应该有不错的Oracle 兼容模式

于 2009-05-29T16:55:48.273 回答
1

HSQLDB 2.0 与 Oracle 一样支持 ANSI 日期文字。所以如果你可以升级到 HSQLDB 2.0,你可以使用:

选择 *
来自 foo
WHERE date_column = DATE '2009-09-09'

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

于 2010-11-21T16:14:20.237 回答
0

通常不建议在 Oracle 中使用“date = 'literal string'”谓词 - 它对 NLS_DATE_FORMAT 设置很敏感,并且经常导致对您在结果集中查找的内容产生误解(在上面的示例中,您是否想要所有记录那天或只是那些恰好在午夜创建的?)

如果您需要两个数据库的统一查询字符串,您可以在 Oracle 中重命名表并创建一个名称为 foo 的视图,并在视图逻辑中将日期数据类型转换为 varchar2。您可能需要向表中添加基于函数的索引,以允许对重铸值进行有效搜索。

于 2009-05-29T17:24:33.603 回答
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> 
于 2009-05-31T00:55:19.733 回答