如何获得下一个季度



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

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

我的数据库中实际的季度是: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

,结果如下:

例子但现在我用7月的任何日期进行模拟,例如'07/12/22',因为它已经在第三季度了(根据我的数据库),结果必须是第四季度的项目,但它继续带来第三季度的结果

:

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

结果:结果

如果我把这行改成+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个月-今天也可以,你不需要添加一个月;这只是目前可行的最低限度。今天(6月)加上3个月是9月,仍然是Q3。

作为字符串比较并不理想。如果您在日期列上有一个索引,那么转换为字符串将防止使用该索引,并且您必须转换每行中的值以进行比较(除非您添加了基于函数的索引)。

最好使用日期范围,在当前季度开始的基础上加上三个月和六个月;比如:

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

和日期范围涵盖所有Q4。

,db&lt的在小提琴

最新更新