如何获得下一季度

How to get the next quarter

我没有太多经验,我很难解决这个问题。

我需要带来这个 SQL 的结果,显示基于 API 请求发送的“SYSDATE”日期的“下一个季度”的数据。

我数据库中的实际季度是:Q2。

根据我在下面 运行 的这个查询,似乎一切都按预期进行,因为我在今天的日期发送请求,在当前季度,所以这个 SQL给我带来下一季度项目的结果(显然)

select
dgl.LABEL                 as goLiveName  
,dgl.GOLIVE_DATE_ACTUAL   as planningCurrent
,dgl.GOLIVE_DATE_PLANNED  as planningBaseline
,dgl.EFFECTIVE_START_DATE as effectiveStartDate
,dgl.EFFECTIVE_END_DATE   as effectiveEndDate
from   DATALAKE.DWL_GOLIVE dgl
where
and   to_char(dgl.GOLIVE_DATE_PLANNED, 'yyyy - q') = to_char(add_months(sysdate, +1), 'yyyy - q')
AND   ( :nextquarter = 'true')
order by goLiveName, planningCurrent asc

这是结果:

Example

但现在我正在模拟 7 月的任何日期,例如“07/12/22”,因为它已经在第 3 季度(根据我的数据库),结果必须是第 4 季度的项目, 但它继续带来 Q3

的结果

像这样:

select
dgl.LABEL                 as goLiveName  
,dgl.GOLIVE_DATE_ACTUAL   as planningCurrent
,dgl.GOLIVE_DATE_PLANNED  as planningBaseline
,dgl.EFFECTIVE_START_DATE as effectiveStartDate
,dgl.EFFECTIVE_END_DATE   as effectiveEndDate
from   DATALAKE.DWL_GOLIVE dgl
where
   to_char (dgl.GOLIVE_DATE_PLANNED, 'yyyy - q' ) = to_char (add_months (to_date('07/12/22', 'mm/dd/yy'), +1), 'yyyy - q' ) -- EXEMPLO
AND   ( :nextquarter = 'true')
order by goLiveName, planningCurrent asc

结果:RESULT

如果我用 +1 更改此行:

to_char (dgl.GOLIVE_DATE_PLANNED, 'yyyy - q' ) = to_char (add_months (to_date('07/12/22', 'mm/dd/yy'), +1), 'yyyy - q' )

对于这一行,不同之处在于 +3 并将带来 Q4 的项目:

to_char (dgl.GOLIVE_DATE_PLANNED, 'yyyy - q' ) = to_char (add_months (to_date('07/12/22', 'mm/dd/yy'), +3), 'yyyy - q' )

这就是我想要的结果

RESULT WITH +3

我意识到,如果相差1个月,只需要+1,如果相差2个月+2,如果相差3个月+3。 如何调整我的 SQL 以始终带来下一个季度?

您可以随时增加 3 个月 - 今天也可以,您不需要增加 1 个月;这只是今天可以使用的最低限度。今天(6月)加上3个月就是9月,还是Q3

虽然比较字符串并不理想。如果您的日期列上有索引,则转换为字符串会阻止使用该索引,并且您必须转换每一行中的值以进行比较(除非您添加了 function-based 索引)。

最好使用日期范围,基于在当前季度开始前增加三个月和六个月;类似于:

where dgl.GOLIVE_DATE_PLANNED >= add_months(trunc(sysdate, 'Q'), 3)
and   dgl.GOLIVE_DATE_PLANNED <  add_months(trunc(sysdate, 'Q'), 6)

要查看其作用,您可以查看涉及的值:

select sysdate as today,
  trunc(sysdate, 'Q') as current_q_start,
  add_months(trunc(sysdate, 'Q'), 3) as next_q_start,
  add_months(trunc(sysdate, 'Q'), 6) as following_q_start
from dual
TODAY               CURRENT_Q_START     NEXT_Q_START        FOLLOWING_Q_START
------------------- ------------------- ------------------- -------------------
2022-06-03 23:41:13 2022-04-01 00:00:00 2022-07-01 00:00:00 2022-10-01 00:00:00

所以日期范围将涵盖从 7 月 1 日午夜到 - 但不包括 - 10 月 1 日午夜的所有时间;也就是说,整个 7 月、8 月和 9 月,也就是下个季度 Q3 的所有时间。

如果 运行 在 7 月 12 日,您会看到:

TODAY               CURRENT_Q_START     NEXT_Q_START        FOLLOWING_Q_START
------------------- ------------------- ------------------- -------------------
2022-07-12 00:00:00 2022-07-01 00:00:00 2022-10-01 00:00:00 2023-01-01 00:00:00

日期范围涵盖整个第四季度。

db<>fiddle