我在How to get monthly periods between a date range in Oracle PL/SQL中遇到了同样的问题。但我需要生成每个组的日期范围之间的所有月度期间。我如何修改上面的决定?
因此,我期望这样的结果:如果A组的日期范围为(01/01/2023-03/10/2023),则B组的日期范围为(01/05/2023-05/12/2023)
Group Start End
A - 01/01/2023 - 01/31/2023
A - 02/01/2023 - 02/28/2023
A - 03/01/2023 - 03/10/2023
B - 01/05/2023 - 01/31/2023
B - 02/01/2023 - 02/28/2023
B - 03/01/2023 - 03/31/2023
B - 04/01/2023 - 04/30/2023
B - 05/01/2023 - 05/12/2023
4条答案
按热度按时间juud5qan1#
这是一个 * 行生成器 * 技术问题;
case
表达式用于区分整个周期中的第一个和最后一个日期。就像这样:样本数据:
查询从这里开始;
temp
CTE有助于简化 main 查询,因为它计算范围日期之间的月份。没有它也可以完成,但是查询比它应该的更复杂(在我看来):dfty9e192#
您可以使用递归查询和
ADD_MONTHS
函数重复添加一个月:其中,对于样本数据:
输出:
| ID| DT_FROM| DT_TO|
| - -----|- -----|- -----|
| 一个|2019 - 01 - 21 00:00:00| 2023 - 01 - 31 23:59:59|
| 一个|2019 - 02 - 21 00:00:00| 2023 - 02 - 28 23:59:59|
| 一个|2019 - 03 - 01 00:00:00| 2019 - 03 - 10 00:00:00|
| B级|2019 - 01 - 05 00:00:00| 2023 - 01 - 31 23:59:59|
| B级|2019 - 02 - 21 00:00:00| 2023 - 02 - 28 23:59:59|
| B级|2019 - 03 - 01 00:00:00| 2023 - 03 - 31 23:59:59|
| B级|2019 - 04 - 01 00:00:00| 2023 - 04 - 30 23:59:59|
| B级|2023 - 05 - 01 00:00:00| 2019 - 05 - 12 00:00:00|
DATE
总是有一个时间组件(您的客户端应用程序可能默认只显示日期,而不显示时间组件,但这并不意味着它们不存在;只是没有显示出来)。fiddle
byqmnocz3#
我已经明白了,在
connect by level
之后只需要使用group by
。所有级别都将自动正确。v440hwme4#
我还建议分析以下示例:
DBFiddle:https://dbfiddle.uk/A0RbUvJh
简短说明:
xmltable('a to b')
作为一个简单的生成器,例如:greatest
返回一个或多个表达式列表中的最大值,例如,greatest(3,4,2,6)
返回6。https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/GREATEST.htmlleast
是一个类似的函数:https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/LEAST.htmlMONTHS_BETWEEN(date1,date2)
返回日期date1和date2之间的月数:https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/MONTHS_BETWEEN.htmlLAST_DAY(date)
返回包含date的月份的最后一天的日期:https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/LAST_DAY.htmlADD_MONTHS(date,integer)
返回date日期加上整数月份:https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/ADD_MONTHS.htmlTRUNC(date,'mm')
返回月份的第一天:https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/TRUNC-date.html