sql >> データベース >  >> RDS >> Oracle

PL/SQL (任意の年の任意の四半期の最初と最後の日を計算する方法)

    この質問は非常に紛らわしいと思います。本当の問題が任意の DATE の四半期を計算する方法である場合 次に、次のような例が既にたくさんあります:

    任意の日付の四半期を計算する方法

    テストのためのいくつかの日付:

    create table lots_of_dates as
    select trunc(sysdate - level * 7) as d
    from dual
    connect by level <= 52;
      

    四半期を見つける:

    select d,
           to_char(d, 'YYYY-Q') as QUARTER,
           trunc(d, 'Q') as Q_FIRST_DAY,
           add_months(trunc(d, 'Q'), 3) - 1 as Q_LAST_DAY
    from lots_of_dates
    order by 1;
      

    結果:

    D                  QUARTE Q_FIRST_DAY        Q_LAST_DAY
    ------------------ ------ ------------------ ------------------
    02-SEP-12          2012-3 01-JUL-12          30-SEP-12
    09-SEP-12          2012-3 01-JUL-12          30-SEP-12
    16-SEP-12          2012-3 01-JUL-12          30-SEP-12
    23-SEP-12          2012-3 01-JUL-12          30-SEP-12
    30-SEP-12          2012-3 01-JUL-12          30-SEP-12
    07-OCT-12          2012-4 01-OCT-12          31-DEC-12
    14-OCT-12          2012-4 01-OCT-12          31-DEC-12
    21-OCT-12          2012-4 01-OCT-12          31-DEC-12
    28-OCT-12          2012-4 01-OCT-12          31-DEC-12
    04-NOV-12          2012-4 01-OCT-12          31-DEC-12
    11-NOV-12          2012-4 01-OCT-12          31-DEC-12
    ...
      

    四半期の最初と最後の日を返す PL/SQL プロシージャ

    四半期の開始日と終了日は、年の部分を除くすべての年で一定です。つまり第 2 四半期は常に 4 月 1 日に始まり、毎年 6 月 30 日に終わります。したがって、日と月は固定でき、年の部分のみを調整する必要があります。

    関数は 1 つの値しか返すことができないため、代わりにサブルーチンがプロシージャとして実装されます。プロシージャに関数ラッパーも提供しました:

    -- raises CASE_NOT_FOUND for non-existing quarters
    create or replace procedure get_quarter_days(
      p_year in number,
      p_quarter in number,
      p_first_day out date,
      p_last_day out date
    ) deterministic as
    begin
      case p_quarter
        when 1 then
          p_first_day := to_date(p_year || '-01-01', 'YYYY-MM-DD');
          p_last_day  := to_date(p_year || '-03-31', 'YYYY-MM-DD');
        when 2 then
          p_first_day := to_date(p_year || '-04-01', 'YYYY-MM-DD');
          p_last_day  := to_date(p_year || '-06-30', 'YYYY-MM-DD');
        when 3 then
          p_first_day := to_date(p_year || '-07-01', 'YYYY-MM-DD');
          p_last_day  := to_date(p_year || '-09-30', 'YYYY-MM-DD');
        when 4 then
          p_first_day := to_date(p_year || '-10-01', 'YYYY-MM-DD');
          p_last_day  := to_date(p_year || '-12-31', 'YYYY-MM-DD');
      end case;
    end;
    /
    show errors
    
    create or replace function get_quarter_first_day(
      p_year in number,
      p_quarter in number
    ) return date deterministic as
      v_first_day date;
      v_last_day date;
    begin
      get_quarter_days(p_year, p_quarter, v_first_day, v_last_day);
      return v_first_day;
    end;
    /
    show errors
    
    create or replace function get_quarter_last_day(
      p_year in number,
      p_quarter in number
    ) return date deterministic as
      v_first_day date;
      v_last_day date;
    begin
      get_quarter_days(p_year, p_quarter, v_first_day, v_last_day);
      return v_last_day;
    end;
    /
    show errors
      

    上記のサブルーチンの使用方法:

    declare
      v_first_day date;
      v_last_day date;
    begin
      get_quarter_days(2011, 1, v_first_day, v_last_day);
      dbms_output.put_line(v_first_day || ' - ' || v_last_day);
      get_quarter_days(2012, 2, v_first_day, v_last_day);
      dbms_output.put_line(v_first_day || ' - ' || v_last_day);
      get_quarter_days(2013, 3, v_first_day, v_last_day);
      dbms_output.put_line(v_first_day || ' - ' || v_last_day);
      get_quarter_days(2014, 4, v_first_day, v_last_day);
      dbms_output.put_line(v_first_day || ' - ' || v_last_day);
    
      dbms_output.put_line(get_quarter_first_day(2015, 1) || ' - ' ||
                           get_quarter_last_day(2015, 1));
    end;
    /
      


    1. LIKEとアポストロフィを使用したMysqlクエリの問題

    2. QThreadワーカークラスに引数を渡すにはどうすればよいですか?

    3. AWSでMySQLまたはMariaDBを管理するためのRDSとEC2の比較

    4. パスワードが指定されていない場合にMySQLルートログインを無効にするにはどうすればよいですか?