如何在Oracle中获取最近十年的列表

3

我该如何在Oracle中获取最近10年的列表?

这是我的尝试:

   SELECT TO_CHAR(SYSDATE,'yyyy') FROM DUAL
   UNION ALL 
   SELECT TO_CHAR(ADD_MONTHS(SYSDATE,-12),'yyyy') FROM DUAL
   UNION ALL
   SELECT to_char(add_months(sysdate,-24),'yyyy') FROM DUAL
   UNION ALL
   SELECT TO_CHAR(ADD_MONTHS(SYSDATE,-36),'yyyy') FROM DUAL
   UNION ALL
   SELECT TO_CHAR(ADD_MONTHS(SYSDATE,-48),'yyyy') FROM DUAL
   UNION ALL
   SELECT TO_CHAR(ADD_MONTHS(SYSDATE,-60),'yyyy') FROM DUAL
   UNION ALL
   SELECT TO_CHAR(ADD_MONTHS(SYSDATE,-72),'yyyy') FROM DUAL
   UNION ALL
   SELECT TO_CHAR(ADD_MONTHS(SYSDATE,-84),'yyyy') FROM DUAL

1
努力一下。尝试一些东西。 - user554546
将所有365*10个日期列为列表? - Maheswaran Ravisankar
1
我投票关闭此问题,因为OP没有展示任何努力,属于不相关的话题。 - user554546
需要比这更多的信息。你是指过去10年的价值?日期格式是什么?最近10年的表名?备份?版本? - Mr. Llama
一只手拍掌的声音是什么? - Mike Nakis
3个回答

21

让我从一个简单的技巧开始

SELECT LEVEL FROM
DUAL
CONNECT BY LEVEL <= 10;

这将生成1、2、...10行。

它能够工作是因为CONNECT BY会尝试链接行,每个行都有一个级别。现在我们提到LEVEL <= 10,因此会生成10行。!!!

你现在的问题是,从SYSDATE中减去12个月,重复10次。

所以答案就是

SELECT TO_CHAR(SYSDATE,'YYYY')-LEVEL+1 FROM
DUAL
CONNECT BY LEVEL <= 10;

现在,您可以开动您的创造力,按照自己的意愿来定制这个 SQL。

祝你好运!


非常感谢您,Maheswaran!!!! 这对我来说非常有启发性,谢谢您,先生! - JamDakh

2

您可以使用连接级别"技巧"来生成行:

select to_char(add_months(trunc(sysdate, 'yyyy'), -12*(level -1)), 'yyyy') yr
from   dual
connect by level <= 10; -- possibly 11 if you want this year along with the previous 10 years

YR  
----
2015
2014
2013
2012
2011
2010
2009
2008
2007
2006

1

一个简单的递归查询和一些基本数学运算就可以实现这个目标:

SELECT     CAST (TO_CHAR (SYSDATE, 'yyyy') AS NUMBER) - LEVEL + 1 AS year
FROM       DUAL
CONNECT BY LEVEL <= 10

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接