是否可以编写一个查询,该查询返回两个指定日期之间每天的日期?

时间:2010-04-01 08:40:25

标签: sql date plsql oracle10g

基本上,问题就是这么说。我需要一个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

4 个答案:

答案 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已经有这样的功能,否则不会。