sql >> Databasteknik >  >> RDS >> Oracle

Oracle-fråga för att få ett visst datum

Baserat på beskrivningen i din fråga och kommentarer vill du ha något i stil med:

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

Med några exempeldatum i en CTE, inklusive några diskuterade men även andra:

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;

får

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 kolumn är den du är intresserad av, de andra försöker bara visa hur det fungerar.

Det ser konstigt ut att ha resultatdatumen ur sekvens jämfört med inmatningsdatumen - 2018-06-03 går till 2018--06-10 sedan de både före och efter det går till 2018-07-01. Men det verkar vara det du vill.




  1. Parallella transaktioner i mysql

  2. MySQL-villkor från flera rader

  3. SQL:ta bort dubbletter av värden från ett urval baserat på 2 fält

  4. Kontexthanterare för Pythons MySQLdb