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