2016-12-11 22 views
1

私のマシンでOracle XEを使用しています。to_dateを使用したOracleの日付の比較

Name  Type 
ENAME  VARCHAR2(20) 
DOJ  DATE 

は単純なselect発砲:
のようにテーブルを定義

選択* test1.tasty1から。

ENAME    DOJ 
sat     08-DEC-16 

ので、[OK]を - 私はDATEフィールドは、それの時間コンポーネントを持っていることを認識しています。
TRUNCを使用して、次のクエリは正常に動作します:

はTRUNC(DOJ)= '08 -DEC-16' test1.tasty1から選択*;

今、私は 'to_date'関数をテストしたかったのですが、以下のクエリのどれもうまくいきませんでした。

test1.tasty1ここDOJ = TO_DATE('08 -12-2016' 、 'DD-MM-YYYY')SELECT * FROM。
select * from test1.tasty1 DOJ = to_date('08 -DEC-2016 '、' DD-MON-YYYY ');
select * from test1.tasty1ここで、DOJ = to_date('08 -DEC-16 '、' DD-MON-YY ');
* from test1.tasty1ここで、DOJ = to_date('08 -DEC-16 '、' dd-mon-RR ');

はSO上で次のを見て撮影していた:
Oracle TO_DATE not working

ここで何が間違っているので、わかりませんか?

+0

次のクエリを実行してください: 'SELECT * FROM test1.tasty1 WHERE DOJ = '2016-08-12'' ...これは何かを返しますか? AFAIK試した4つのクエリのうちのいくつかは、そのレコードを返す必要があります。 –

+0

私は 'select * from test1.tasty1 DOJ = '08 -DEC-16'; 'を試しても' literalはフォーマット文字列と一致しません '結果が出ない –

+0

これは私があなたに実行を依頼したものではありません。私は 'WHERE DOJ = '2016-08-12'' –

答えて

0

あなたの質問とコメントから、これは起こったイベントのシーケンスであるようです。

あなたがあなたのテーブルに次のINSERTをした:

INSERT INTO test1.tasty1 VALUES ('sat', SYSDATE) 

は日付時間コンポーネントの両方を持っているオラクルの日付があることに注意してください。だから、たとえあなたが'2016-12-08'の日付を挿入したとしても、でもが挿入されています。その結果、次のクエリはすべてのレコードを返していません:あなたは時間コンポーネントを指定したことがないので、以前挿入されたレコードが一致していないので、

SELECT * FROM test1.tasty1 WHERE DOJ = '2016-08-12' 

これはおそらくです。あなたは日付部分のみを比較したい場合は、次のようにTRUNCを使用することができます。

SELECT * FROM test1.tasty1 WHERE TRUNC(DOJ) = '2016-08-12' 

前進あなたの問題を解決するには、あなたが本当に唯一の対処したい場合は、挿入時TRUNCSYSDATEをラップすることです日付コンポーネント。

ところで、リテラルとして使用される'08-DEC-16'の形式は、Oracleによって有効な日付として認識されません。代わりに、'2016-12-08'を使用してください。日付と日付の比較が正確であるよう

+0

Tim - ありがとう - 私は時間の部分とTRUNCを使用する必要があります。これは理解される。私が理解していないのは、これは、時間コンポーネントが関わっている場合(これは私の例です)、TO_DATEが機能しないことを意味しますか? –

+0

@satishmaratheあなたの場合、比較を行っている列に_does_は時間成分を持っているので、それにもマッチしなければ、比較はAFAIKでは機能しません。しかし、時間構成要素を持たない切り捨てられた日付と、時間構成要素なしで作成された 'to_date'とを比較しているなら、私は比較が機能すると期待します。 –

+0

これで意味が分かりました。to_dateは '時間'の側面も考慮に入れ、比較を行っているので(それ以下ではない)、正確な一致を試みます。日付フィールドを使用するだけで、時間には関心がありません。どのデータ・タイプを使用する必要がありますか?必要に応じて、別の質問を投稿してください。 –

0

あなたはこのように試してみました:

select * from test1.tasty1 where to_date(DOJ,'DD-MM-YYYY') = to_date('08-12-2016','DD-MM-YYYY'); 

は、マンゴーとりんごやないとリンゴを比較してください。

+0

日付オブジェクトをto_dateあなたはLHSとFYIで推薦しています - 提案されたSQLは結果も出ません - リンゴとリンゴの比較はオレンジを返しました! :)。 @TimBiegeleisenの状態に基づいて意味をなさない - ここには時間要素が関わっている –