Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 在oracle中获取基于年份的记录_Database_Oracle_Oracle11g_Database Performance_Date Arithmetic - Fatal编程技术网

Database 在oracle中获取基于年份的记录

Database 在oracle中获取基于年份的记录,database,oracle,oracle11g,database-performance,date-arithmetic,Database,Oracle,Oracle11g,Database Performance,Date Arithmetic,我正在创建一个查询,根据年份给出两天之间的天数。实际上我有以下类型的日期范围 From Date: TO_DATE('01-Jun-2011','dd-MM-yyyy') To Date: TO_DATE('31-Dec-2013','dd-MM-yyyy') 我的结果应该是: Year Number of day ------------------------------ 2011 XXX 2012 XX

我正在创建一个查询,根据年份给出两天之间的天数。实际上我有以下类型的日期范围

From Date: TO_DATE('01-Jun-2011','dd-MM-yyyy') 
To Date:   TO_DATE('31-Dec-2013','dd-MM-yyyy')
我的结果应该是:

   Year         Number of day
   ------------------------------
   2011           XXX
   2012           XXX
   2013           XXX
我试过下面的问题

WITH all_dates AS
  (SELECT start_date + LEVEL - 1 AS a_date
  FROM
    (SELECT TO_DATE ('21/03/2011', 'DD/MM/YYYY') AS start_date ,
      TO_DATE ('25/06/2013', 'DD/MM/YYYY')       AS end_date
    FROM dual
    )
    CONNECT BY LEVEL <= end_date + 1 - start_date
  )
SELECT TO_CHAR ( TRUNC (a_date, 'YEAR') , 'YYYY' ) AS YEAR,
  COUNT (*) AS num_days
FROM all_dates
WHERE a_date - TRUNC (a_date, 'IW') < 7
GROUP BY TRUNC (a_date, 'YEAR')
ORDER BY TRUNC (a_date, 'YEAR') ;
我的问题是,若我使用connect by,那个么查询执行将花费很长时间,因为表中有数百万条记录,所以我不想使用connect by子句 connect by子句正在针对特定记录创建虚拟行


如果您有任何帮助或建议,我们将不胜感激。

在Oracle中,您可以对这样的日期执行加法和减法运算

挑选 截止日期“2013年12月31日”和“dd-MM-yyyy”-截止日期“2011年6月1日”和“dd-MM-yyyy” 从双倍开始的天


它将返回两个日期之间的日差…

在Oracle中,您可以对这样的日期执行加法和减法

select to_date(2011, 'yyyy'), to_date(2012, 'yyyy'), to_date(2013, 'yyyy')
from dual;

TO_DATE(2011,'Y TO_DATE(2012,'Y TO_DATE(2013,'Y
--------------- --------------- ---------------
01-MAY-11       01-MAY-12       01-MAY-13
挑选 截止日期“2013年12月31日”和“dd-MM-yyyy”-截止日期“2011年6月1日”和“dd-MM-yyyy” 从双倍开始的天


它将返回两个日期之间的天数差…

从您模糊的预期结果来看,我认为您想要的是这些日期之间的记录数,而不是天数;但这相当不清楚。因为您在问题中引用了一个表,所以我假设您想要一些与表数据相关的内容,而不仅仅是两个日期之间的天数,这完全不依赖于一个表。不过,我不知道connect by子句引用是什么意思。如果这是你想要的,那么这应该给你:

select to_date(2011, 'yyyy'), to_date(2012, 'yyyy'), to_date(2013, 'yyyy')
from dual;

TO_DATE(2011,'Y TO_DATE(2012,'Y TO_DATE(2013,'Y
--------------- --------------- ---------------
01-MAY-11       01-MAY-12       01-MAY-13
select extract(year from date_field), count(*)
from t42
where date_field >= to_date('01-Jun-2011', 'DD-MON-YYYY')
and date_field < to_date('31-Dec-2013') + interval '1' day
group by extract(year from date_field)
order by extract(year from date_field);

.

从你模糊的预期结果来看,我认为你想要的是这些日期之间的记录数量,而不是天数;但这相当不清楚。因为您在问题中引用了一个表,所以我假设您想要一些与表数据相关的内容,而不仅仅是两个日期之间的天数,这完全不依赖于一个表。不过,我不知道connect by子句引用是什么意思。如果这是你想要的,那么这应该给你:

select extract(year from date_field), count(*)
from t42
where date_field >= to_date('01-Jun-2011', 'DD-MON-YYYY')
and date_field < to_date('31-Dec-2013') + interval '1' day
group by extract(year from date_field)
order by extract(year from date_field);

.

您可以使用下面的函数来减少虚拟行的数量,只考虑其间的年份。您可以检查以检查性能

首先,只考虑开始日期和当年年底之间的天数,或者 如果在同一年,则为结束日期

然后考虑从开始日期的下一年到结束日期的年份之间的年份

最后考虑从开始日期到结束日期的日期天数< /P> 因此,我们不需要迭代开始日期和结束日期之间的所有日期,而只需要迭代年份

WITH all_dates AS
(SELECT (TO_CHAR(START_DATE,'yyyy') + LEVEL - 1) YEARS_BETWEEN,start_date,end_date 
FROM
(SELECT TO_DATE ('21/03/2011', 'DD/MM/YYYY') AS start_date ,
TO_DATE ('25/06/2013', 'DD/MM/YYYY')       AS end_date
FROM dual
)  
CONNECT BY LEVEL <= (TO_CHAR(end_date,'yyyy')) - (TO_CHAR(start_date,'yyyy')-1)
) 
SELECT DECODE(TO_CHAR(END_DATE,'yyyy'),YEARS_BETWEEN,END_DATE
,to_date('31-12-'||years_between,'dd-mm-yyyy'))
- DECODE(TO_CHAR(START_DATE,'yyyy'),YEARS_BETWEEN,START_DATE
,to_date('01-01-'||years_between,'dd-mm-yyyy'))+1,years_between
FROM ALL_DATES;

您可以使用下面的函数来减少虚拟行数,只考虑其间的年份。您可以检查以检查性能

首先,只考虑开始日期和当年年底之间的天数,或者 如果在同一年,则为结束日期

然后考虑从开始日期的下一年到结束日期的年份之间的年份

最后考虑从开始日期到结束日期的日期天数< /P> 因此,我们不需要迭代开始日期和结束日期之间的所有日期,而只需要迭代年份

WITH all_dates AS
(SELECT (TO_CHAR(START_DATE,'yyyy') + LEVEL - 1) YEARS_BETWEEN,start_date,end_date 
FROM
(SELECT TO_DATE ('21/03/2011', 'DD/MM/YYYY') AS start_date ,
TO_DATE ('25/06/2013', 'DD/MM/YYYY')       AS end_date
FROM dual
)  
CONNECT BY LEVEL <= (TO_CHAR(end_date,'yyyy')) - (TO_CHAR(start_date,'yyyy')-1)
) 
SELECT DECODE(TO_CHAR(END_DATE,'yyyy'),YEARS_BETWEEN,END_DATE
,to_date('31-12-'||years_between,'dd-mm-yyyy'))
- DECODE(TO_CHAR(START_DATE,'yyyy'),YEARS_BETWEEN,START_DATE
,to_date('01-01-'||years_between,'dd-mm-yyyy'))+1,years_between
FROM ALL_DATES;

我真的不确定你想做什么。是否要计算两个日期之间的天数?或者检索每年的记录数?@GuillemVicens:我想知道一年之间的天数。在我的示例中,日期范围为2011年6月1日至2013年12月31日。因此,它有三个时段,即2011年、2012年和2013年。其中第一个时段为2011年6月1日至2011年12月31日,第二个时段为2012年1月1日至2012年12月31日,第三个时段为2013年1月1日至2013年12月31日。我需要这个数据行。数百万条记录从哪里来?你指的是哪一个表,你是否将这个结果se与其他结果连接起来?或者你想用一张真正的桌子而不是双人桌子做类似的事情?那个where子句应该做什么?at总是评估为真的,肯定吗?我真的不确定你们想做什么。是否要计算两个日期之间的天数?或者检索每年的记录数?@GuillemVicens:我想知道一年之间的天数。在我的示例中,日期范围为2011年6月1日至2013年12月31日。因此,它有三个时段,即2011年、2012年和2013年。其中第一个时段为2011年6月1日至2011年12月31日,第二个时段为2012年1月1日至2012年12月31日,第三个时段为2013年1月1日至2013年12月31日。我需要这个数据行。数百万条记录从哪里来?你指的是哪一个表,你是否将这个结果se与其他结果连接起来?或者你想用一张真正的桌子而不是双人桌子做类似的事情?where子句应该做什么-at总是计算为true,当然?谢谢你的回复。看,我修改了一些细节。谢谢你的回复。看,我修改了一些细节。谢谢。我认为这是一个有趣的答案。让我尝试一下,并会让你知道相同的事情。他很抱歉,迟到了,想让你知道你的解决方案对我有效。。。谢谢你的帮助…:谢谢,我觉得很有趣
呃..让我试试,我会告诉你的。他很抱歉迟到了,想让你知道你的解决方案对我有效。。。谢谢你的帮助…: