在 Oracle 中生成时间段内有间隔的日期
Generate Dates in oracle with gaps during Time Period
我需要在特定时间段内生成日期(使用 Oracle SQL 开发人员 12 和 18)。
/
我找到了以下解决方案:
SELECT TO_DATE('01/01/2020','DD/MM/YYYY') + (ROWNUM - 1) DATEGEN
FROM ALL_OBJECTS
WHERE TO_DATE('01/01/2020','DD/MM/YYYY') + (ROWNUM -1) <= TO_DATE('01/11/2020','DD/MM/YYYY')
我得到每日约会(如下所示):
01-JAN-20 12.00.00 AM
02-JAN-20 12.00.00 AM
03-JAN-20 12.00.00 AM
04-JAN-20 12.00.00 AM
05-JAN-20 12.00.00 AM
06-JAN-20 12.00.00 AM
我需要获取间隔 5 天或 3 天的日期(示例):
01-JAN-20 12.00.00 AM
05-JAN-20 12.00.00 AM
10-JAN-20 12.00.00 AM
15-JAN-20 12.00.00 AM
有什么建议吗?!
提前致谢。
您可以使用具有简单逻辑的分层查询,如下所示:
SELECT DATE '2020-01-01' + ( LEVEL * 5 ) - 1
FROM DUAL CONNECT BY
LEVEL <= ( DATE '2020-11-01' - DATE '2020-01-01' ) / 5;
请注意,在你的问题中,前两个日期相差 4 天,在我的解决方案中,第一个日期为 05-01-2020
您可以使用标准递归查询:
with cte (dt) as (
select date '2020-01-01' from dual
union all
select dt + interval '5' day from cte where dt < date '2020-01-15'
)
select * from cte order by dt
您可以根据需要调整边界,或者将它们移动到另一个cte:
with
params (startdt, enddt) as (
select date '2020-01-01', date '2020-01-15' from dual
),
cte (dt, enddt) as (
select startdt dt, enddt from params
union all
select dt + interval '5' day, enddt from cte where dt < enddt
)
select dt from cte order by dt
请注意,您的示例数据中日期之间的间隔不是恒定的(前两个日期之间有 4 天,然后是 5 天。
您可能需要根据实际需要调整递归成员的 where
子句。在这里,最后一天可能是 1 月 15 日。如果您不希望这样,请将 where
子句更改为:
where dt + interval '5' day < enddt
我需要在特定时间段内生成日期(使用 Oracle SQL 开发人员 12 和 18)。 / 我找到了以下解决方案:
SELECT TO_DATE('01/01/2020','DD/MM/YYYY') + (ROWNUM - 1) DATEGEN
FROM ALL_OBJECTS
WHERE TO_DATE('01/01/2020','DD/MM/YYYY') + (ROWNUM -1) <= TO_DATE('01/11/2020','DD/MM/YYYY')
我得到每日约会(如下所示):
01-JAN-20 12.00.00 AM
02-JAN-20 12.00.00 AM
03-JAN-20 12.00.00 AM
04-JAN-20 12.00.00 AM
05-JAN-20 12.00.00 AM
06-JAN-20 12.00.00 AM
我需要获取间隔 5 天或 3 天的日期(示例):
01-JAN-20 12.00.00 AM
05-JAN-20 12.00.00 AM
10-JAN-20 12.00.00 AM
15-JAN-20 12.00.00 AM
有什么建议吗?! 提前致谢。
您可以使用具有简单逻辑的分层查询,如下所示:
SELECT DATE '2020-01-01' + ( LEVEL * 5 ) - 1
FROM DUAL CONNECT BY
LEVEL <= ( DATE '2020-11-01' - DATE '2020-01-01' ) / 5;
请注意,在你的问题中,前两个日期相差 4 天,在我的解决方案中,第一个日期为 05-01-2020
您可以使用标准递归查询:
with cte (dt) as (
select date '2020-01-01' from dual
union all
select dt + interval '5' day from cte where dt < date '2020-01-15'
)
select * from cte order by dt
您可以根据需要调整边界,或者将它们移动到另一个cte:
with
params (startdt, enddt) as (
select date '2020-01-01', date '2020-01-15' from dual
),
cte (dt, enddt) as (
select startdt dt, enddt from params
union all
select dt + interval '5' day, enddt from cte where dt < enddt
)
select dt from cte order by dt
请注意,您的示例数据中日期之间的间隔不是恒定的(前两个日期之间有 4 天,然后是 5 天。
您可能需要根据实际需要调整递归成员的 where
子句。在这里,最后一天可能是 1 月 15 日。如果您不希望这样,请将 where
子句更改为:
where dt + interval '5' day < enddt