例如,我需要在 SQL 查询中按日期选择
SELECT * FROM foo WHERE date = '2009-09-09'
该查询适用于我的 Hypersonic 测试数据库,但不适用于 Oracle,这似乎需要:
SELECT * FROM foo WHERE date = TO_DATE('2009-09-09', 'yyyy-mm-dd')
有没有办法在这两个数据库中统一按日期选择?
我找到了答案 - 您可以在 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')
两者都适用。
您可以尝试将 H2 数据库作为您的内存数据库(http://www.h2database.com)。它应该有不错的Oracle 兼容模式。
HSQLDB 2.0 与 Oracle 一样支持 ANSI 日期文字。所以如果你可以升级到 HSQLDB 2.0,你可以使用:
选择 * 来自 foo WHERE date_column = DATE '2009-09-09'
在两个数据库中(实际上甚至更多的数据库)
通常不建议在 Oracle 中使用“date = 'literal string'”谓词 - 它对 NLS_DATE_FORMAT 设置很敏感,并且经常导致对您在结果集中查找的内容产生误解(在上面的示例中,您是否想要所有记录那天或只是那些恰好在午夜创建的?)
如果您需要两个数据库的统一查询字符串,您可以在 Oracle 中重命名表并创建一个名称为 foo 的视图,并在视图逻辑中将日期数据类型转换为 varchar2。您可能需要向表中添加基于函数的索引,以允许对重铸值进行有效搜索。
如果可以,您可以在 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>