如何获得下一季度
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
日期范围涵盖整个第四季度。
我没有太多经验,我很难解决这个问题。
我需要带来这个 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
日期范围涵盖整个第四季度。