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

これら2つのデータベース間で日付で均一に選択する方法はありますか?

4

5 に答える 5

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

両方で動作します。

于 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 にアップグレードできる場合は、以下を使用できます。

選択する *
FROM フー
WHERE date_column = DATE '2009-09-09'

両方のデータベース (実際にはさらに多くのデータベース)

于 2010-11-21T16:14:20.237 に答える
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 に答える
0

通常、Oracle の "date = 'literal string'" 述語は推奨されません。NLS_DATE_FORMAT 設定の影響を受けやすく、結果セットで何を探しているかについて誤解を招くことがよくあります (上記の例では、すべてのレコードが必要ですか?その日または真夜中に作成されたものだけですか?)

両方のデータベースに同じクエリ文字列が必要な場合は、Oracle でテーブルの名前を変更し、foo という名前のビューを作成し、ビュー ロジックで日付データ型を varchar2 にキャストします。リキャスト値を効率的に検索できるようにするには、関数ベースのインデックスをテーブルに追加する必要があります。

于 2009-05-29T17:24:33.603 に答える