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

特定の日付を取得するためのOracleクエリ

    質問の説明とコメントに基づいて、次のようなものが必要です。

    case when start_date = next_day(trunc(start_date, 'MM') - 1, 'Sunday') -- date is on first sunday
         then next_day(start_date, 'Sunday') -- next Sunday, which is second in month
         else next_day(last_day(start_date), 'Sunday') -- first Sunday of next month
    end
    

    CTEのいくつかのサンプル日付で、議論されたものだけでなく他のものも含まれます:

    with cte (start_date) as (
                select date '2018-05-30' from dual
      union all select date '2018-06-01' from dual
      union all select date '2018-06-02' from dual
      union all select date '2018-06-03' from dual
      union all select date '2018-06-04' from dual
      union all select date '2018-06-30' from dual
      union all select date '2018-07-01' from dual
      union all select date '2018-07-02' from dual
      union all select date '2018-07-03' from dual
      union all select date '2018-07-04' from dual
      union all select date '2018-07-05' from dual
      union all select date '2018-07-06' from dual
      union all select date '2018-07-07' from dual
      union all select date '2018-07-08' from dual
      union all select date '2018-07-31' from dual
      union all select date '2018-08-01' from dual
      union all select date '2018-08-02' from dual
      union all select date '2018-08-03' from dual
      union all select date '2018-08-04' from dual
      union all select date '2018-08-05' from dual
      union all select date '2018-08-06' from dual
    )
    select start_date,
      to_char(start_date, 'Dy') as day,
      case when to_char(start_date, 'Dy') = 'Sun'
           then 'Yes' else 'No' end as is_sunday,
      case when start_date = next_day(trunc(start_date, 'MM') - 1, 'Sunday')
           then 'Yes' else 'No' end as is_first_sunday,
      next_day(trunc(start_date, 'MM') - 1, 'Sunday') as first_sun_this_month,
      next_day(trunc(start_date, 'MM') + 6, 'Sunday') as second_sun_this_month,
      next_day(last_day(start_date), 'Sunday') as first_sun_next_month,
      case when start_date = next_day(trunc(start_date, 'MM') - 1, 'Sunday') -- date is on first sunday
           then next_day(start_date, 'Sunday') -- next Sunday, which is second in month
           else next_day(last_day(start_date), 'Sunday') -- first Sunday of next month
      end as result
    from cte;
    

    取得

    START_DATE DAY          IS_ IS_ FIRST_SUN_ SECOND_SUN FIRST_SUN_ RESULT    
    ---------- ------------ --- --- ---------- ---------- ---------- ----------
    2018-05-30 Wed          No  No  2018-05-06 2018-05-13 2018-06-03 2018-06-03
    2018-06-01 Fri          No  No  2018-06-03 2018-06-10 2018-07-01 2018-07-01
    2018-06-02 Sat          No  No  2018-06-03 2018-06-10 2018-07-01 2018-07-01
    2018-06-03 Sun          Yes Yes 2018-06-03 2018-06-10 2018-07-01 2018-06-10
    2018-06-04 Mon          No  No  2018-06-03 2018-06-10 2018-07-01 2018-07-01
    2018-06-30 Sat          No  No  2018-06-03 2018-06-10 2018-07-01 2018-07-01
    2018-07-01 Sun          Yes Yes 2018-07-01 2018-07-08 2018-08-05 2018-07-08
    2018-07-02 Mon          No  No  2018-07-01 2018-07-08 2018-08-05 2018-08-05
    2018-07-03 Tue          No  No  2018-07-01 2018-07-08 2018-08-05 2018-08-05
    2018-07-04 Wed          No  No  2018-07-01 2018-07-08 2018-08-05 2018-08-05
    2018-07-05 Thu          No  No  2018-07-01 2018-07-08 2018-08-05 2018-08-05
    2018-07-06 Fri          No  No  2018-07-01 2018-07-08 2018-08-05 2018-08-05
    2018-07-07 Sat          No  No  2018-07-01 2018-07-08 2018-08-05 2018-08-05
    2018-07-08 Sun          Yes No  2018-07-01 2018-07-08 2018-08-05 2018-08-05
    2018-07-31 Tue          No  No  2018-07-01 2018-07-08 2018-08-05 2018-08-05
    2018-08-01 Wed          No  No  2018-08-05 2018-08-12 2018-09-02 2018-09-02
    2018-08-02 Thu          No  No  2018-08-05 2018-08-12 2018-09-02 2018-09-02
    2018-08-03 Fri          No  No  2018-08-05 2018-08-12 2018-09-02 2018-09-02
    2018-08-04 Sat          No  No  2018-08-05 2018-08-12 2018-09-02 2018-09-02
    2018-08-05 Sun          Yes Yes 2018-08-05 2018-08-12 2018-09-02 2018-08-12
    2018-08-06 Mon          No  No  2018-08-05 2018-08-12 2018-09-02 2018-09-02
    

    result 列はあなたが興味を持っているものであり、他の人はただ少しだけ機能していることを示しようとします。

    入力日付と比較して、結果の日付が順序どおりになっていないように見えます-2018-06-03は2018--06-10に移動し、その前後の日付は2018-07-01に移動します。しかし、それはあなたが望むもののようです。




    1. MySQLデータベーステーブルのレコードの最大数

    2. 複雑なMySQLクエリが誤った結果を出している

    3. MySqlの大きなテーブルと分析

    4. DjangoでNorthwindを実装する方法