oracle 如何查询两个时间段里的每一天数据之和。(只有开始日期和结束日期,没有每一天日期)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle 如何查询两个时间段里的每一天数据之和。(只有开始日期和结束日期,没有每一天日期)相关的知识,希望对你有一定的参考价值。

这样的不知道每一天的日期,直接where .. between ... and ... group by...就可以了。
如果想给定日期段,获取每天作为一条记录,可以有一种方式,但日期范围不能太大,否则效率会有问题。
select trunc(Start_Date)+rownum from 表名
where rownum<=trunc(End_Date)-trunc(Start_Date)

前提是:表中要有足够的记录数,但也不能太多,否则效率同样会低。
参考技术A select trunc(date列),sum(a)
form table
where date列 between xx and xx
group by trunc(date列)
参考技术B select distinct trunc(time_column) day1, value from table_name group by trunc(time_column)

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

【中文标题】是否可以编写一个查询来返回两个指定日期之间的每一天的日期?【英文标题】: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 &lt;= n,或者,对于更复杂的数据集,使用流水线函数。如果你能想到一种算法来生成数据,你可以在 Oracle 中编写一个查询来生成它。

以上是关于oracle 如何查询两个时间段里的每一天数据之和。(只有开始日期和结束日期,没有每一天日期)的主要内容,如果未能解决你的问题,请参考以下文章

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

Oracle获取一段时间范围内的日期,从2006-01-01到2013-12-31的每一天的日期表

mysql怎么得到时间段每一天,不用表,就是得到一个时间段的每一天的日期

PHP 获取两个日期时间戳段内的每一天日期包括当前时间的日期

如何找到从 10 月 1 日至今的每一天的价格总和

oracle 查询一段时间内每一天的统计数据sql怎么写