問題は2つあります。まず、日付にはほぼ確実に時間要素があります。 to_date('06-MAR-11','DD-MON-YY')
2011/03/06 00:00:00
と同等です 。 TRUNC()
を使用する場合 その日のすべてを見ることができる関数:
select *
from test_table
where trunc(creation_date) = to_date('06-MAR-11','DD-MON-YY');
私は MON日時形式モデルを使用します。ここで説明するように、それはあなたの地域と設定に依存します。代わりに、数値の月形式モデルを使用する方が安全です。同様に、常に年の一部として世紀を指定します。
where trunc(creation_date) = to_date('06-03-YY11','DD-MM-YYYY');
2番目の問題は、ほぼ間違いなくNLS_DATE_FORMATです。時間が考慮されていないように見えるため、4つの同じ日付が表示されます。これは、データが表示される方法のみを管理します。 保存方法ではありません。
次のようなものを使用してこれを変更できます:
ALTER SESSION SET NLS_DATE_FORMAT = "DD/MM/YYYY HH24:MI:SS"
以下を使用してテスト環境をセットアップした場合:
create table test_table ( creation_date date );
insert into test_table values ( sysdate );
insert into test_table values ( sysdate - 0.01 );
alter session set nls_date_format = "YYYY/MM/DD";
返されるデータに時間が含まれていないことがわかります(SYSDATEには含まれていますが):
SQL> select * from test_table;
CREATION_D
----------
2013/04/12
2013/04/12
NLS_DATE_FORMATを変更し、同じSELECTを実行すると、時間コンポーネントが得られます。
SQL> alter session set nls_date_format = "YYYY/MM/DD HH24:MI:SS";
Session altered.
SQL> select * from test_table;
CREATION_DATE
-------------------
2013/04/12 12:48:41
2013/04/12 12:34:17
最後に、今日の日付だけを選択しようとすると、行は返されません:
SQL> select *
2 from test_table
3 where creation_date = to_date('20130412','yyyymmdd');
no rows selected
ただし、TRUNC()
を使用する場合 フィールドの日付部分のみを比較するには、すべての行を再度取得します。
SQL> select *
2 from test_table
3 where trunc(creation_date) = to_date('20130412','yyyymmdd');
CREATION_DATE
-------------------
2013/04/12 12:48:41
2013/04/12 12:34:17
2番目の質問に実際に答えるために、一意の日付が必要な場合は、TRUNC()
を再利用できます。 機能:
select distinct trunc(creation_date)
from test_table