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 <= n
,或者,对于更复杂的数据集,使用流水线函数。如果你能想到一种算法来生成数据,你可以在 Oracle 中编写一个查询来生成它。以上是关于oracle 如何查询两个时间段里的每一天数据之和。(只有开始日期和结束日期,没有每一天日期)的主要内容,如果未能解决你的问题,请参考以下文章
Oracle获取一段时间范围内的日期,从2006-01-01到2013-12-31的每一天的日期表
mysql怎么得到时间段每一天,不用表,就是得到一个时间段的每一天的日期