我没有太多的经验,而且我在解决这个问题上有困难。
我需要根据API请求发送的"SYSDATE“日期来显示”下一季度“的数据的SQL结果。
我的数据库中的实际季度是: 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',并且由于它已经在Q3 (根据我的db),结果必须是Q4的项目,但它继续带来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结果:结果
如果我用+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' )这就是我想要的结果
我意识到,如果差是1个月,那么它只需要+1,如果差是2个月+2,如果差是3个月+3,如何调整我的SQL,使下一个季度总是这样?
发布于 2022-06-03 22:34:48
你总是可以增加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 dualTODAY 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。
https://stackoverflow.com/questions/72495641
复制相似问题