是否可以编写一个查询来返回两个指定日期之间的每一天的日期?
Posted
技术标签:
【中文标题】是否可以编写一个查询来返回两个指定日期之间的每一天的日期?【英文标题】:Is it possible to write a query which returns a date for every day between two specified days? 【发布时间】:2010-04-01 08:40:25 【问题描述】:基本上,问题说明了一切。我需要一个 PL\SQL 查询,它返回两个日期之间的日期列表,这样对于 2010 年 1 月 1 日到 2010 年 1 月 20 日,我将返回 20 行:
the_date
--------
01-JAN-2010
02-JAN-2010
03-JAN-2010
04-JAN-2010
...
20-JAN-2010
【问题讨论】:
【参考方案1】:以下查询将返回 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');
【讨论】:
【参考方案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中,如果variable可以用在LEVEL条件下,那么就可以求解了。
更新2:
确实有几个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 中,针对 dual 的操作进行了优化,因此它们不需要逻辑或物理 I/O 操作。这使它们非常快。',所以我想说这并不完全深奥。
【讨论】:
哎呀,我不知道从哪里开始将这种语法翻译成 PL/SQL,不过努力吧! hm 现在没有 ORA,但是如果 CONNECT BY 能够使用 ROWNUM 并终止它,那么它可能类似于 SELECT ROWNUM as sq, 1 as child, 1 as parent FROM DUAL通过先前的 child=parent 和 rownum adp-gmbh.ch/ora/sql/connect_by.html 干得好不合理,CONNECT BY LEVEL 语法对我来说就像是胜利!【参考方案3】:好的,所以它可能看起来有点老套,但这是我想出的:
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
【讨论】:
【参考方案4】:没有。查询只能返回现有数据 - 如果您没有所有日期的表格,那么您就出局了。
也就是说(我不是 oracle 专家),函数或存储过程应该能够做到这一点。在 SQL Server 中,我将有一个函数返回一个表(然后我可以在连接中使用)。
但是一个纯粹的查询 - 不。除非oracle已经有这样的功能。
【讨论】:
现有数据是什么意思? -1 - 在 Oracle 中,您可以生成任何您想要的数据,例如使用经典的SELECT ROWNUM FROM DUAL CONNECT BY LEVEL <= n
,或者,对于更复杂的数据集,使用流水线函数。如果你能想到一种算法来生成数据,你可以在 Oracle 中编写一个查询来生成它。以上是关于是否可以编写一个查询来返回两个指定日期之间的每一天的日期?的主要内容,如果未能解决你的问题,请参考以下文章
oracle 如何查询两个时间段里的每一天数据之和。(只有开始日期和结束日期,没有每一天日期)