首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获得下一个季度

如何获得下一个季度
EN

Stack Overflow用户
提问于 2022-06-03 22:18:02
回答 1查看 48关注 0票数 1

我没有太多的经验,而且我在解决这个问题上有困难。

我需要根据API请求发送的"SYSDATE“日期来显示”下一季度“的数据的SQL结果。

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

根据我下面运行的这个查询,似乎所有事情都像预期的那样正常工作,因为我在本季度在今天的日期发送请求,所以这个SQL给我带来了下一个季度的项目的结果(显然)

代码语言:javascript
复制
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',并且由于它已经在Q3 (根据我的db),结果必须是Q4的项目,但它继续带来Q3的结果。

就像这样:

代码语言:javascript
复制
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更改这一行:

代码语言:javascript
复制
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中获取项目:

代码语言:javascript
复制
to_char (dgl.GOLIVE_DATE_PLANNED, 'yyyy - q' ) = to_char (add_months (to_date('07/12/22', 'mm/dd/yy'), +3), 'yyyy - q' )

这就是我想要的结果

结果+3

我意识到,如果差是1个月,那么它只需要+1,如果差是2个月+2,如果差是3个月+3,如何调整我的SQL,使下一个季度总是这样?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-03 22:34:48

你总是可以增加3个月--这在今天也能起作用,你不需要再加一个月;这只是今天起作用的最低限度。今天(6月)加上3个月将是9月份,仍然是Q3。

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

最好是根据本季度开始时增加三个月和六个月来使用日期范围;如下所示:

代码语言:javascript
复制
where dgl.GOLIVE_DATE_PLANNED >= add_months(trunc(sysdate, 'Q'), 3)
and   dgl.GOLIVE_DATE_PLANNED <  add_months(trunc(sysdate, 'Q'), 6)

要了解这是在做什么,您可以查看所涉及的值:

代码语言:javascript
复制
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
代码语言:javascript
复制
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日运行,您将看到:

代码语言:javascript
复制
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<>fiddle

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72495641

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档