Oracle to_date機能四半期のフォーマッ
-
25-09-2019 - |
質問
だかの記録で作成された範囲ます。例えば、私ためのすべての記録の作成と第4四半期は、2008年第1四半期の2010年.私はこの私の場句:
...and r.record_create_date between to_date('2008 4','YYYY Q')
and to_date('2010 1','YYYY Q')
がOracleは 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;
もちろん、失敗します。
(Oracle10g)
解決
Oracleは ORA-01820: format code cannot appear in date input format
.の Q
有効な日付フォーマット記号でお使いいただくことによってのがあった。
の第二の表の下欄2.15で http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/sql_elements004.htm#i34948.全てのフォーマット要素を許可に変換する場合、タイムスタンプなど。
私のおすすめの対利用のための日付の範囲の確認をしています。人くらいの頻度で見逃値以内に期日に期待が含まれていた。ようなのです:
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.
他のヒント
誰かがOTN上に同じ質問をし//フォーラム.oracle.com /フォーラム/ thread.jspa?スレッドID = 1081398&TSTART = 255
のは、問題の核心は、あなたができることですの のないののTO_DATE関数で "Q" を指定します。
あなたはすでに日付の部分を指定していることを考えると、なぜの全体の日付を提供していませんか?あなたが本当に月31日、2010年をしたいとき...深夜に2番目にto_date('2010 1','YYYY Q')
はあなた月1日、2010年を与えることにも気に。
、それはTO_DATE(「2008年1」、「YYYY qを」)行うには意味がありません。どのような日付が返されるべき? 、四半期末、四半期の最初の...? (一方、四半期に日付を変換 - 。TO_CHARのような特定の日付のみ四分の一に存在するため(SYSDATE、「YYYY Qは」)理にかなっている)
だから、あなたは2四半期の間にある日付のルックスは、あなたが「あなたは自分のrolll」に持っていることをクエリたい場合(明示的に四半期の開始/終了の日付を記載する。)
TO_DATE機能なしの「日付文字列1」と「日付string2の」BETWEEN WHERE DATE_VALUE:はサイドノートとして、ケースには誰もがのようなものを使用しないでくださいTO_DATEを使用していない検討しています。これは、デフォルトの日付書式を想定し、特定の状況の下で、完全に潜在的に有用なインデックスを回避することができます。
以下は、は、同じクエリが異なる結果を有することができ、一例である。
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
は(注意は、第二のインスタンスにエラーが返されないこと。それはちょうど1月10日、0001及び12月10日、0031を想定している。)
私は最善の方法でもTO_DATEで悩まずに、単に入力に四半期の開始日と四半期の終了日であると思います。あなたが使用している場合、私は思う。
between '1-Jan-10' and '31-Dec-10'
たとえば、あなたは(オラクルでは、私は信じて)いない必要性のTO_DATEを行うと、それははるかに困難四半期の番号を入力するよりもではありません。
計算Oracle、初日の四半期の四半期から、四半期:を利用したいと
start_month=-2+3*四半期
last_month=3*四半期
variable v_year number
variable v_quarter number
exec :v_year :=2017
exec :v_quarter:=4
select :v_year as year,
:v_quarter as quarter,
to_date(:v_year||to_char(-2+3*:v_quarter,'fm00'),'yyyymm') as quarter_start,
last_day(to_date(:v_year||to_char(3*:v_quarter,'fm00')||'01 23:59:59','yyyymmdd hh24:mi:ss')) as quarter_end
from dual a;
YEAR|QUARTER|QUARTER_START |QUARTER_END
2017| 4|2017-10-01 00:00:00|2017-12-31 23:59:59