0

私はOracleデータベースを使用しています。次のクエリです。

select codi_belf, data_elab,id_inte,anno from mimsspam_tab where id_inte = 504;

6 件のレコードを取得します

E924 05-AGO-15 504 2015
D458 05-AGO-15 504 2015
D458 05-AGO-15 504 2015
B275 05-AGO-15 504 2015
E924 05-AGO-15 504 2015
B275 05-AGO-15 504 2015

ここで、「data_elab」は DATE 型のフィールドで、AGO は AUG のイタリア語ロケールです。

私はこのように日付でフィルタリングしようとします:

select codi_belf, data_elab,id_inte,anno 
from mimsspam_tab where id_inte = 504 
and data_elab = TO_DATE('05/08/2015','dd/MM/yyyy');

そして、私は結果を得ません..

さらに、この方法でフィルタリングすると:

select codi_belf, data_elab,id_inte,anno  
from mimsspam_tab where id_inte = 504 
and TO_CHAR(data_elab,'dd/MM/yyyy')='05/08/2015';

6枚のレコードを取り戻しました!

フィルタリングの 2 つの方法は同等であるべきではありませんか? なぜそうではないのですか?そして、最初のレコードが 6 枚すべて食べられるのはなぜですか? これは、クエリを実行している oracle インストールの奇妙な構成に依存する可能性がありますか?

4

2 に答える 2

3

data_elab 列には、その列を選択したときにデフォルトの nls_date_format 設定が原因で表示されない時間要素があるようです。

data_elab にインデックスがない場合、次の行を返す必要があります。

and trunc(data_elab) = TO_DATE('05/08/2015','dd/MM/yyyy');

data_elab にインデックスがあり、それを使用する場合は、次のようにします。

and data_elab >= TO_DATE('05/08/2015','dd/MM/yyyy')
and data_elab < TO_DATE('06/08/2015','dd/MM/yyyy')
于 2015-08-05T11:48:26.753 に答える
2

最初のクエリに表示されるのは、NLS パラメータによって決定される、データベースのデフォルトの日付形式です。日付フィールドには実際に時間情報が含まれていますが、表示されません。

2 番目のクエリでは、 を使用するときに aを にto_date()変換し、時間情報を提供しないため、 の時間部分を取得します。それをフィールド (時間情報を含む) と比較すると、一致しません。stringdate00:00:00date

3 番目のクエリでは、 を使用するときに、日付フィールドを時間情報を含まない にto_char()変換します。stringそれをリテラルと比較すると、string一致したレコードが得られます。

日付フィールドは、文字列ではなくバイナリ情報と考えるようにしてください。データベースのデフォルト パラメータに依存しないようにしてください。

于 2015-08-05T11:45:14.213 に答える