0

次の条件に基づいたmax dateフォームを取得するクエリを作成しようとしています。Table_A

指定された日付(入力パラメーター)がその年の4月1日から9月30日までの間にMAX(date)ある場合は、 4月1日より前に戻ります。

また

指定された日付(入力パラメーター)が10月1日から翌年の3月31日までの間にMAX(date)ある場合は、 10月1日より前に戻ります。

例えば ​​:

  1. 所定の日付は2012年12月27日(10月1日から翌年の3月31日までの日付)で、2012年9月29日に戻ります。
  2. 所定の日付は2012年8月17日(4月1日から翌年の9月30日までの日付)の返却日(4月1日より前の最大日付は3月29日)
4

2 に答える 2

3

これを試して:

select max(case
            when trunc(the_date) between to_date('01-apr-'||the_year, 'dd-mon-yyyy')
                                     and to_date('30-sep-'||the_year, 'dd-mon-yyyy')
             and dte < to_date('01-apr-'||the_year, 'dd-mon-yyyy')
            then
              dte
            when trunc(the_date) between to_date('01-oct-'||the_year, 'dd-mon-yyyy')
                                     and to_date('31-mar-'||(the_year+1), 'dd-mon-yyyy')
             and dte < to_date('01-oct-'||the_year, 'dd-mon-yyyy')
            then
              dte
           end) max_date
  from table_a a 
       cross join (select v_inp_date the_date,
                          to_char(add_months(v_inp_date,-3), 'yyyy') the_year
                     from dual) dte;

入力した日付はdte一部にあります

v_inp_date

 to_char(add_months(v_inp_date,-3), 'yyyy') the_year

例:小さなテスト:

SQL> create table table_a(dte date);

    Table created.

SQL> insert into table_a values(to_date('28-sep-2012', 'dd-mon-yyyy'));

1 row created.

SQL> insert into table_a values(to_date('29-sep-2012', 'dd-mon-yyyy'));

1 row created.

SQL> insert into table_a values(to_date('28-mar-2012', 'dd-mon-yyyy'));

1 row created.

SQL> insert into table_a values(to_date('29-mar-2012', 'dd-mon-yyyy'));

1 row created.

SQL> insert into table_a values(to_date('28-sep-2011', 'dd-mon-yyyy'));

1 row created.

SQL> insert into table_a values(to_date('27-mar-2011', 'dd-mon-yyyy'));

1 row created.

SQL> commit;

Commit complete.

SQL> var inpdate varchar2(20);
SQL> exec :inpdate := '27-dec-2012';

PL/SQL procedure successfully completed.

SQL> select max(case
  2              when trunc(the_date) between to_date('01-apr-'||the_year, 'dd-mon-yyyy')
  3                                       and to_date('30-sep-'||the_year, 'dd-mon-yyyy')
  4               and dte < to_date('01-apr-'||the_year, 'dd-mon-yyyy')
  5              then
  6                dte
  7              when trunc(the_date) between to_date('01-oct-'||the_year, 'dd-mon-yyyy')
  8                                       and to_date('31-mar-'||(the_year+1), 'dd-mon-yyyy')
  9               and dte < to_date('01-oct-'||the_year, 'dd-mon-yyyy')
 10              then
 11                dte
 12             end) max_date
 13    from table_a a
 14         cross join (select to_date(:inpdate,'dd-mon-yyyy') the_date,
 15                            to_char(add_months(to_date(:inpdate,'dd-mon-yyyy'), -3), 'yyyy') the_year
 16                       from dual) dte;

MAX_DATE
---------
29-SEP-12

SQL> exec :inpdate := '17-aug-2012';

PL/SQL procedure successfully completed.

SQL> /

MAX_DATE
---------
29-MAR-12

SQL> exec :inpdate := '01-oct-2011';

PL/SQL procedure successfully completed.

SQL> /

MAX_DATE
---------
28-SEP-11

SQL> exec :inpdate := '01-apr-2011';

PL/SQL procedure successfully completed.

SQL> /

MAX_DATE
---------
27-MAR-11

SQL>
于 2012-12-27T17:35:57.423 に答える
0

私の例の終了日は2012年12月31日で、2013年以降に拡張できます。私はその場でテーブルを作成しています-max_dateはすべての行に出力されます。また、最大日付をハードコーディングします。これを行う必要はありません。これは単なる例です。&1と&2を引用符なしの値に置き換えます...:

SELECT date_table --, start_date, end_date
, (CASE WHEN date_table BETWEEN To_Date('01-APR-2012') And To_Date('30-SEP-2012') Then max_apr_date 
        WHEN date_table BETWEEN To_Date('01-OCT-2012') And To_Date('31-DEC-2012') Then max_oct_date
   END) max_date
FROM
(
SELECT *
  FROM
  (
   SELECT TRUNC(SYSDATE,'Y')+LEVEL-1   date_table
        , To_Date('&1')                start_date  
        , To_Date('&2')                end_date 
        , '29-MAR-2012'                max_apr_date 
        , '29-Sep-2012'                max_oct_date
    FROM dual 
    CONNECT BY LEVEL <= (ADD_MONTHS(TRUNC(SYSDATE,'Y'),12)-TRUNC(SYSDATE,'Y') )
  )
   WHERE date_table BETWEEN start_date AND end_date
)
/
于 2012-12-27T19:40:44.550 に答える