2012-05-10 50 views
3

2つの表の日付を比較するのに問題がありますが、一方の表の日付はDD-Mon-YY形式で、もう1つはYYYYMM形式です。DD-Mon-YYからYYYYMMへのOracle SQLの変換日付形式

私は両者を比較するためにYYYYMMを作成する必要があります。私はこのようなものを作成する必要があり

:CREATE_DATE 12日 - 3月 - 2006年とoffer_dateのようなものである

SELECT * FROM offers 
WHERE offer_date = (SELECT to_date(create_date, 'YYYYMM') FROM customers where id = '12345678') 
AND offer_rate > 0 

は、私はこのクエリを適応させる必要がある200605の

任意のアイデアのようなものです?

+1

なぜあなたは問題がありますか? offer_dateは 'VARCHAR2'(文字列)ですか? – Phil

+0

日付にはそのような形式はありません。その形式が必要な場合は、文字列を定義する必要があります。だから、あなたは文字列(その形式)またはDATETIME(形式を持たない)を探していますか?したがって、フィールドの形式が異なる場合は、実際のデータ型はどうなりますか? DATETIME、VHARCHAR()など? – MatBailie

+0

@phil - offer_dateはNUMBERフィールドです。 – Tom

答えて

2

は数であり、あなたの本当の日付より低い精度であり、これは動作する可能性...
- 形式の文字列にあなたの本当の日付を変換しますYYYYMM
は - INT
にその値をCONVER - 比較結果をあなたのoffer_date

SELECT 
    * 
FROM 
    offers 
WHERE 
    offer_date = (SELECT CAST(to_char(create_date, 'YYYYMM') AS INT) FROM customers where id = '12345678') 
AND offer_rate > 0 

をまた、上のすべての操作を行うことによって、では、1つの値に対してのみ処理を行います。

さらに、offer_dateを操作した場合、そのフィールドでインデックスを利用できないため、SEEKの代わりにSCANを強制します。

1

何か不足していますか?あなただけの比較でoffer_date変換することができます:

offer_dateとして
SELECT * 
FROM offers 
WHERE to_char(offer_date, 'YYYYMM') = (SELECT to_date(create_date, 'YYYYMM') FROM customers where id = '12345678') AND 
     offer_rate > 0 
+0

私はあなたが解決策の近くのどこかにいると思います。 – Tom

+0

'where to_char(offer_date、 'YYYYMM')=(to_char(create_date、 'YYYYMM')を選択してください。)これは、create_dateがDATE形式であり、offer_dateがNUMBER形式であると言うことに役立ちますか? FR ... 'は正しい方法で私を指してくれてありがとう – Tom

+2

@Tom:do_char()で' offer_date'をラップすると、そのフィールドのインデックスがわかりにくくなります。 'create_date'のすべての処理は、このクエリに対して一度だけ行う必要がありますので、' offer_date'でインデックスを検索します。* [データを操作することにほぼ無制限にスカラー定数を操作する検索されています。] * – MatBailie

関連する問題