我有一个Oracle查询,该查询将在下个月的第一个星期日返回。现在,我在这里有一个条件来检查下个月的第一天是否是星期日,那么它需要在下一个星期日返回。否则,下个月的第一个星期日。
我的查询:
DEF startDate = to_date('somedate', 'dd/mm/yyyy');
Select next_day(last_day(&startDate),'Sunday' ) from dual ;
预期产量:如果我们输入2018年7月,则必须返回2018年8月5日(第一个星期日)。如果是2018年6月,则必须返回7月8日(而不是7月1日是第一天和周日)
Input Expected Output
Jul-18 05-Aug-18,
Aug-18 02-sep-18,
June-18 08-jul-18,
因为第一天是星期日,所以我们正在考虑下一个星期日7月8日。
答案 0 :(得分:3)
如果您传递给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
如果“开始日期”始终是该月的第一天,则您不需要trunc(..., 'MM')
部分;该月份中的任何一天,并在该月的1号返回午夜。
答案 1 :(得分:0)
您可以使用下面的Oracle Query获取当月的第一个星期日
SELECT DECODE(TRIM(TO_CHAR(TRUNC(SYSDATE, 'MM'), 'DAY')), 'SUNDAY', (TRUNC(SYSDATE, 'MM'), NEXT_DAY((TRUNC(SYSDATE, 'MM'), 'SUNDAY')) FROM DUAL