Sql 甲骨文查询第一个星期日

Sql 甲骨文查询第一个星期日,sql,oracle,oracle11g,oracle10g,oracle-sqldeveloper,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

我有一个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日,7月1日是第一天和周日)


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

如果您传递到下一天()的日期已经是第一个星期天,您将获得第二个星期天,那么请在下个月的第一天传递。您可以通过查找当前月份的第一个月并添加一个月来获得该值;或者通过查找当月的最后一天并添加一天:

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')
部分;这会占用一个月中的任何一天,并在该月的第一天返回午夜。

如果您传入下一天()的日期已经是第一个星期天,那么您将获得第二个星期天,因此请在下个月的第一天传入。您可以通过查找当前月份的第一个月并添加一个月来获得该值;或者通过查找当月的最后一天并添加一天:

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')
部分;这需要一个月中的任何一天,并在该月的第一天返回午夜。

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


从DUAL中选择DECODE(TRIM(TO_CHAR(TRUNC(SYSDATE,'MM'),'DAY')),'SUNDAY',(TRUNC(SYSDATE,'MM'),NEXT_DAY((TRUNC(SYSDATE,'MM'),'SUNDAY'))您可以使用下面的Oracle查询来获取当前月份的第一个星期日


选择解码(TRIM(TO_CHAR(TRUNC(SYSDATE,'MM'),'DAY')),'SUNDAY',(TRUNC(SYSDATE,'MM'),'SUNDAY'),下一天((TRUNC(SYSDATE,'MM'),'SUNDAY'))从DUAL

这有什么不同?我们的输入只有月份和年份。逻辑是,如果我给出任何月份和年份,它必须返回下个月的第一个星期日,如果下个月的第一天是星期日,那么我们需要第二个星期日。这有什么不同?我们的输入只有月份和年份。逻辑是,如果我给出任何月份和年份r、 它必须在下个月的第一个星期天返回,如果下个月的第一天是星期天,那么我们需要第二个星期天。我创建了这个查询:DEF startDate=to_date('11/2018','mm/yyyy');选择&startDate,next_day(添加_months(trunc(&startDate,'mm'),1)“星期日”)作为结果1,下一天(trunc(&startDate,'MM')+间隔“1”个月,“星期日”)作为结果2,下一天(最后一天(&startDate)+1,“星期日”)作为dual的结果3;我们可以将其嵌入到函数中吗?它必须以月份和年份为单位并返回上述结果。当然,如果您要在许多地方执行相同的操作,您可以创建一个函数来执行此操作。您不需要从dual中进行选择,只需重新执行即可直接注册下一天()
。你能帮我创建一个函数吗?我已经创建了这个查询:DEF startDate=to_date('11/2018','mm/yyyy');选择&startDate,next_day(添加月数(trunc(&startDate,'mm'),1),'Sunday'))结果1,下一天(trunc(&startDate,'MM')+间隔“1”个月,'Sunday')结果2,下一天(最后一天(&startDate)+1,“Sunday”)作为dual的结果3;我们可以将其嵌入到函数中吗?它必须以月份和年份为单位并返回上述结果。当然,如果您要在许多地方执行相同的操作,您可以创建一个函数来执行此操作。您不需要从dual中进行选择,只需重新执行即可直接注册下一天()。你能帮我创建一个函数吗?