2016-09-02 2 views
0

特定の四半期の最初の日と最後の日を見つける方法はありますか?ORACLEは特定の四半期の最初の日と最後の日を見つけます

私は第一四半期を選択した場合、私は に第一四半期の初日と最終日を得ることができる必要があり

例:

quarter = 1と年が2016です。期待される結果は01/01/2016-31/03/2007DD/MM/YYYY形式)です。例えば

:現在の年の

初日:

select(quarterdatestart, quarterdatedate) where year = 2016 and quarter = 1; 

答えて

0

はい、あなたは次のように行うことができ、現在の年の

SELECT TRUNC (SYSDATE , ‘YEAR’) FROM DUAL; 

最終日:

SELECT ADD_MONTHS(TRUNC (SYSDATE, ’YEAR’), 12) - 1 FROM DUAL; 

ところで、あなたは、所望の出力を見つけるために、以下のように使用することができます。

with q(qtr) as( 
     select add_months(DATE '2016-01-01', 
     (level - 1) * 3) from dual connect by level <= 4) 
     select qtr as first_day, 
     last_day(add_months(qtr, 2)) as last_day 
from q 
+0

'dateadd'と' datediff'は、SQL関数であり、Oracle関数ではありません。 –

+0

が編集されました。通知をありがとう。 –

+0

は不必要に複雑ですが、oracleは四半期の 'Q'日付形式をサポートしています。 –

0

この

SELECT ADD_MONTHS(to_date('01/01/2017','dd/mm/rrrr') ,3*(:quarter-1)) first, ADD_MONTHS(to_date('01/01/2017','dd/mm/rrrr') ,3*:quarter)-1 last FROM dual 
+0

Plirkeeの場合、2016年2月2日の日付があり、第3四半期はどのように動作しますか? – Giorgos

+0

あなたの四半期は月の初めに開始しないことを意味しますか?あなたはあなたの質問でそれを言及していない...しかし、それは私が推測するまだ動作します。このソリューションで特に問題が見つかっていますか? – Plirkee

+0

ノーリターン2/3/2017 \t 1/6/2017 – Giorgos

4
trunc(sysdate, 'Q') 

はあなたの現在の四半期の最初の日を与える試してみてください。

trunc(add_months(date '0001-01-01', (y-1)*12 + (q-1)*3), 'Q') 

はあなたの年yにおける四半期qの最初の日を与えるでしょう。単純に3ヶ月を追加し、日

<<first day of quarter>> + interval '3' month - interval '1' day 

または

add_months(<<first day of quarter>>, 3) - 1 
を引き、四半期の最終日の真夜中を取得するには別の年と四半期値

with x as (
    select 2016 y, 1 q from dual union all 
    select 2016, 2 from dual union all 
    select 2015, 4 from dual 
) 
select trunc(add_months(date '0001-01-01', (y-1)*12 + (q-1)*3), 'Q') 
    from x 

でこれを呼び出す例

私は一般的にインターバル構文を少しは表現力豊かに見せますが、古い構文はよりコンパクトです。

四半期の最後の日付(四半期の最終日の23:59:59)を希望する場合は、1日ではなく1秒を減算するだけです。

+0

私はこのtruncを理解していません(add_months(date '0001-01-01'、(y-1)* 12 +(q-1)* 3、 'Q') 'は私のために働いていません – Giorgos

+0

@Giorgos - I parenを逃した。修正されました。 –

関連する問題