我需要在SQL查询中按日期选择,例如
SELECT * FROM foo WHERE date = '2009-09-09'
该查询适用于我的Hypersonic测试数据库,但不适用于Oracle,这似乎需要:
SELECT * FROM foo WHERE date = TO_DATE('2009-09-09', 'yyyy-mm-dd')
有没有办法在这两个数据库中统一选择日期?
答案 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>