0

6 つのレコードを取得していることに基づいて個別のレコードについてテーブルをクエリしているときに'creation_date'、タイプの列があります。'date''creation_date'

select distinct creation_date from test_table;

出力:

06-APR-11
06-APR-11
28-MAR-11
06-APR-11
06-APR-11
18-MAR-11

この出力では、クエリでdistinctを使用した場合でも、4月6日が4回表示されます。creation_dateまた、 ofと一致するすべてのレコードを見つけようとして6th April 2011も、結果が得られません。以下は私のクエリです:

select * from  test_table where creation_date = to_date('06-APR-11','DD-MON-YY');

これら2つのクエリで間違っているところを教えてください。

4

2 に答える 2

7

問題は 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
于 2013-04-12T11:43:56.143 に答える
1

DATE データ型には、年 (世紀を含む)、月、日、時、分、および秒 (午前 0 時以降) が格納されます。これも考慮する必要があります。

于 2013-04-12T11:44:52.567 に答える