Oracle 查询第一个星期天

Oracle query for first sunday

我有一个 Oracle 查询,下个月第一个星期日 return。现在我在这里有一个条件来检查下个月的第一天是否是星期日,然后下星期日需要 return。否则,下个月的第一个星期日。

我的查询:

DEF  startDate = to_date('somedate', 'dd/mm/yyyy');
Select next_day(last_day(&startDate),'Sunday' )  from dual ; 

预期输出:如果我们输入 2018 年 7 月,它必须 return 2018 年 8 月 5 日(第一个星期日)。如果是 2018 年 6 月,则必须 return 7 月 8 日(不是 7 月 1 日,这是第一天及其星期日)

Input      Expected Output
   Jul-18   05-Aug-18,
   Aug-18   02-sep-18,
  June-18   08-jul-18,

因为第一天是星期天,所以我们考虑下个星期天 7 月 8 日。

如果您传递给 next_day() 的日期已经是第一个星期日,您将获得第二个星期日,因此请传递下个月的第一天。您可以通过找到当月的第一天并添加一个月来获得它;或找到当月的最后一天并添加一天:

with cte (start_date) as (
            select date '2018-05-14' from dual
  union all select date '2018-06-15' from dual
  union all select date '2018-07-16' from dual
  union all select date '2018-08-17' from dual
)
select start_date,
  next_day(add_months(trunc(start_date, 'MM'), 1), 'Sunday') as result1,
  next_day(trunc(start_date, 'MM') + interval '1' month, 'Sunday') as result2,
  next_day(last_day(start_date) + 1, 'Sunday') as result3
from cte;

START_DATE RESULT1    RESULT2    RESULT3   
---------- ---------- ---------- ----------
2018-05-14 2018-06-03 2018-06-03 2018-06-03
2018-06-15 2018-07-08 2018-07-08 2018-07-08
2018-07-16 2018-08-05 2018-08-05 2018-08-05
2018-08-17 2018-09-02 2018-09-02 2018-09-02

如果 'start date' 始终是每月的第一天,那么您不需要 trunc(..., 'MM') 部分;这需要一个月中的任何一天和该月 1 日的 returns 午夜。

您可以使用下面的 Oracle 查询来获取当月的第一个星期日

SELECT DECODE(TRIM(TO_CHAR(TRUNC(SYSDATE, 'MM'), 'DAY')), 'SUNDAY', (TRUNC(SYSDATE, 'MM'), NEXT_DAY((TRUNC(SYSDATE, 'MM'), 'SUNDAY')) FROM DUAL