我需要编写一个查询,它会给我一个两个日期范围之间的日期列表(开始 日期和结束日期)IN ORACLE。
例如,如果我的开始日期是12/01/2003,结束日期是12/31/2003。我需要生成 我的输出为
Date
----
12/01/2003
12/02/2003
12/03/2003
12/04/2003
12/05/2003
12/06/2003
12/07/2003
12/08/2003
.
.
.
so on till
12/31/2003
答案 0 :(得分:0)
对于Oracle特定解决方案,您可以使用CONNECT BY
select to_date('12/01/2003','MM/DD/YYYY')+level-1
from dual
where to_date('12/01/2003','MM/DD/YYYY')+level-1 between '12/01/2003' and '12/31/2003'
connect by level <= 31
;
如果你想要一个便携式解决方案,你可以尝试更老的技巧。
-- General purpose looper table.
-- Old trick I like to use for joining into queries to generate repeating sequences
-- without using more complex methods and it portable to other databases.
create table looper(i integer primary key) organization index;
begin
for i in 1..100 loop
insert into looper values(i);
end loop;
end;
/
像这样使用它:
select to_date('12/01/2003','MM/DD/YYYY')+looper.i-1
from looper
where to_date('12/01/2003','MM/DD/YYYY')+looper.i-1 between '12/01/2003' and '12/31/2003'
;
其他例子,接下来的12个月给我:
select add_months(sysdate, looper.i)
from looper
where looper.i <= 12
;
答案 1 :(得分:0)
此查询将生成从开始日期到未来x天的日期(在这种情况下,我选择了31天来为您提供示例中的范围):
SELECT TO_DATE('2003-11-30','YYYY-MM-DD')+ROWNUM n
FROM ( SELECT 1 column_name
FROM dual
CONNECT BY LEVEL <= 31
)
但您也可以使用它来生成整年的日期:
SELECT TO_DATE('2002-12-31','YYYY-MM-DD')+ROWNUM n
FROM ( SELECT 1 column_name
FROM dual
CONNECT BY LEVEL <= 365
)
这是我最喜欢的生成日期的方法,因为它非常简单,不需要表,没有程序,没有循环,没有变量等等。所以它可以很容易地嵌套在其他查询中,加入等等。
当然,这种方法的一个缺点是您需要确切知道您的范围内有多少天(例如,如果您想要闰年的日期,则必须将等级设置为366)。
另请注意,“开始日期”不会包含在列表中。