2

ある範囲の四半期で作成されたいくつかのレコードを見つける必要があります。たとえば、2008 年の第 4 四半期から 2010 年の第 1 四半期の間に作成されたすべてのレコードを探しています。

...and r.record_create_date between to_date('2008 4','YYYY Q')
                                and to_date('2010 1','YYYY Q')

しかし、オラクルは次のように述べていますORA-01820: format code cannot appear in date input format。はQ有効な日付形式記号なので、何が起こったのかわかりません。これは、カレンダーの四半期の間に値を見つける有効な方法ですか、それとももっと良い方法がありますか?


また、これを実行すると、興味深い、おそらく関連する可能性があります。

select to_date('2009','YYYY') from dual;

私のIDEに表示される値は2009-08-01. 今日2009-08-04は_ _ _2010-08-04

これ:

select to_date('2009 1','YYYY Q') from dual;

もちろん、失敗します。

(オラクル 10g)

4

5 に答える 5

4

オラクルは次のように述べていますORA-01820: format code cannot appear in date input format。はQ有効な日付形式記号なので、何が起こったのかわかりません。

http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/sql_elements004.htm#i34948にある表 2.15 の 2 番目の列を参照してください。日付、タイムスタンプなどに変換するときに、すべての形式要素が許可されるわけではありません。

日付範囲のチェックに between を使用しないことをお勧めします。多くの場合、含まれるはずの最終日の値を見逃してしまいます。だから私は翻訳します:

and r.record_create_date between to_date('2008 4','YYYY Q')
                             and to_date('2010 1','YYYY Q')

and to_date('2008-10-01', 'YYYY-MM-DD') <= r.record_create_date 
and record_create_date < to_date('2010-04-01', 'YYYY-MM-DD') -- < beginning of 2Q2010.
于 2010-08-04T18:54:10.737 に答える
1

四半期と月の関係は 1 対多であるため、TO_DATE('2008 1', 'yyyy q'); を実行しても意味がありません。どの日付を返す必要がありますか?四半期の最初、四半期の終わり、...? (一方、特定の日付は 1 つの四半期にしか存在しないため、 TO_CHAR(SYSDATE, 'yyyy q') のように日付を四半期に変換することは理にかなっています。)

したがって、2 つの四半期の間にある日付を検索するクエリが必要な場合は、「独自にロールする」必要があります (四半期の開始日/終了日を明示的に指定します)。

補足として、誰かが TO_DATE を使用しないことを検討している場合は、次のようなものを使用しないでください: WHERE date_value BETWEEN 'date string1' and 'date string2' without the TO_DATE function. デフォルトの日付形式を想定しており、特定の状況では、潜在的に有用なインデックスを完全に回避できます。

以下は、同じクエリが異なる結果になる可能性がある 1 つの例です。

select sysdate from dual where sysdate between '1-Jan-10' and '31-Dec-10';


SYSDATE
---------
04-AUG-10

SQL> alter session set nls_date_format = 'YYYY-MM-DD';

Session altered.

SQL> select * from dual where sysdate between '1-Jan-10' and '31-Dec-10'; 

no rows selected

(2 番目のインスタンスではエラーが返されないことに注意してください。0001 年 1 月 10 日と 0031 年 12 月 10 日を想定しているだけです。)

于 2010-08-04T21:08:58.347 に答える
1

誰かが OTN で同じ質問をしました: http://forums.oracle.com/forums/thread.jspa?threadID=1081398&tstart=255

問題の核心は、TO_DATE 関数で「Q」を指定 できないことです。

すでに日付の一部を指定しているのに、日付全体を指定しないのはなぜですか? 2010 年 3 月 31 日が本当にto_date('2010 1','YYYY Q')必要なときに、2010 年 1 月 1 日が返されることに注意してください。

于 2010-08-04T18:45:23.040 に答える
0

to_dateさえ気にせずに、四半期の開始日と四半期の終了日を入力するのが最善の方法だと思います。使えばいいと思います

between '1-Jan-10' and '31-Dec-10'

たとえば、(Oracle では) to_date は必要なく、四半期番号を入力するよりもそれほど難しくありません。

于 2010-08-04T18:49:12.660 に答える