たとえば、SQLクエリで日付で選択する必要があります
SELECT * FROM foo WHERE date = '2009-09-09'
そのクエリは私のHypersonicテストデータベースでは機能しますが、Oracleでは機能しません。
SELECT * FROM foo WHERE date = TO_DATE('2009-09-09', 'yyyy-mm-dd')
これら2つのデータベース間で日付で均一に選択する方法はありますか?
答えが見つかりました.HyperSonicでTO_DATE関数を作成すると、2番目のクエリが両方で機能します. たとえば、クラスを次のように作成します。
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 にアップグレードできる場合は、以下を使用できます。
選択する * FROM フー WHERE date_column = DATE '2009-09-09'
両方のデータベース (実際にはさらに多くのデータベース)
可能であれば、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>
通常、Oracle の "date = 'literal string'" 述語は推奨されません。NLS_DATE_FORMAT 設定の影響を受けやすく、結果セットで何を探しているかについて誤解を招くことがよくあります (上記の例では、すべてのレコードが必要ですか?その日または真夜中に作成されたものだけですか?)
両方のデータベースに同じクエリ文字列が必要な場合は、Oracle でテーブルの名前を変更し、foo という名前のビューを作成し、ビュー ロジックで日付データ型を varchar2 にキャストします。リキャスト値を効率的に検索できるようにするには、関数ベースのインデックスをテーブルに追加する必要があります。