基本上,问题就是这么说。我需要一个PL \ SQL查询,它返回两个日期之间的日期列表,这样,对于01-JAN-2010到20-JAN-2010,我会得到20行返回:
the_date
--------
01-JAN-2010
02-JAN-2010
03-JAN-2010
04-JAN-2010
...
20-JAN-2010
答案 0 :(得分:3)
以下查询将在1/1和1/20(含)之间每天返回。
select to_date('1/1/2010','mm/dd/yyyy')+level
from dual
connect by level <= to_date('1/20/2010','mm/dd/yyyy')
- to_date('1/1/2010','mm/dd/yyyy');
答案 1 :(得分:2)
这是postgres的一个例子,我希望这些方言在递归方面具有可比性
WITH RECURSIVE t(n) AS (
VALUES (1)
UNION ALL
SELECT n+1 FROM t WHERE n < 20
)
SELECT n FROM t;
...将返回20条记录,数字从1到20 将这些转换/转换为日期,你就是
更新: 对不起,这里没有ORA,但根据article
SELECT
SYS_CONNECT_BY_PATH(DUMMY, '/')
FROM
DUAL
CONNECT BY
LEVEL<4;
给出
SYS_CONNECT_BY_PATH(DUMMY,'/')
--------------------------------
/X
/X/X
/X/X/X
还有人说,这应该是生成行的非常有效的方法。 如果ROWNUM可以在上面的select中使用,并且if变量可以在LEVEL条件下使用,那么就可以解决问题。
UPDATE2:
确实有几个options。
SELECT (CAST('01-JAN-2010' AS DATE) + (ROWNUM - 1)) n
FROM ( SELECT 1 just_a_column
FROM dual
CONNECT BY LEVEL <= 20
)
orafaq声明:'应该注意的是,在oracle的后续版本中,至少可以追溯到10gR1,对双重操作进行优化,使得它们不需要逻辑或物理I / O操作。这使得它们非常快。',所以我想说这不是完全深奥的。
答案 2 :(得分:0)
好的,所以看起来有点像hacky,但这就是我想出的:
SELECT (CAST('01-JAN-2010' AS DATE) + (ROWNUM - 1)) AS the_date
FROM all_objects
WHERE ROWNUM <= CAST('20-JAN-2010' AS DATE) - CAST('01-JAN-2010' AS DATE) + 1
魔术酱使用ROWNUM
作为日期算术的种子,我使用all_objects
但你可以使用任何有足够行的表来提供所需的范围。你可以随意改变它以使其工作SYSDATE
而不是对值进行硬编码,但原则上我认为这个想法是合理的。
这是一个返回10天前到10天时间的日期列表的示例:
SELECT (SYSDATE -10 + (ROWNUM-1)) AS the_date
FROM all_objects
WHERE ROWNUM <= (SYSDATE +10) - (SYSDATE -10) + 1
答案 3 :(得分:-1)
没有。查询只能返回现有数据 - 如果您没有全天候的表,那么您就出局了。
那说(我不是oracle专家),函数或存储过程应该能够做到这一点。在SQL Server中,我将有一个函数返回一个表(然后我可以在连接中使用)。
但纯粹的查询 - 没有。除非oracle已经有这样的功能,否则不会。