Oracle查询第一个星期天

时间:2018-07-20 13:51:52

标签: sql oracle oracle11g oracle10g oracle-sqldeveloper

我有一个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日。

2 个答案:

答案 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