基本上,這個問題說明了一切。我需要返回日期的兩個日期之間的列表中的PL \ SQL查詢,從而爲01-JAN-2010到20-JAN-2010我會得到20行返回:是否可以編寫一個查詢,該查詢返回指定日期之間每天的日期?
the_date
--------
01-JAN-2010
02-JAN-2010
03-JAN-2010
04-JAN-2010
...
20-JAN-2010
基本上,這個問題說明了一切。我需要返回日期的兩個日期之間的列表中的PL \ SQL查詢,從而爲01-JAN-2010到20-JAN-2010我會得到20行返回:是否可以編寫一個查詢,該查詢返回指定日期之間每天的日期?
the_date
--------
01-JAN-2010
02-JAN-2010
03-JAN-2010
04-JAN-2010
...
20-JAN-2010
下面是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 演員/轉換這些以日期有你是
UPDATE: 對不起,沒有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可以在上面的選擇中使用,並且如果變量可以在LEVEL條件下使用,那麼可以計算出解決方案。
UPDATE2:
確實也有幾個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,對雙操作進行了優化,使得它們不需要邏輯或物理I/O操作。這使他們相當快。',所以我可以說這不完全是深奧的。
號查詢只可以退貨現有的數據 - 如果你沒有所有日子的表格,你就出去了。
這說(我不是oracle專家),一個函數或存儲過程應該能夠做到這一點。在SQL Server中,我將有一個函數返回一個表(然後我可以在連接中使用)。
但純粹的查詢 - 沒有。除非oracle有這樣的功能,否則不是。
你對現有數據有什麼意義? – systempuntoout 2010-04-01 08:50:01
是的,但有雙重性和遞歸性:D – Unreason 2010-04-01 09:15:39
-1 - 在Oracle中,您可以生成您希望的任何數據,例如,使用經典的'從RUALUM FROM DUAL CONNECT BY LEVEL <= n',或者對於更復雜的數據集,使用流水線函數。如果您可以考慮一種算法來生成數據,則可以在Oracle中編寫一個查詢來生成它。 – 2010-04-03 08:17:40
OK,所以它可能看起來有點哈克,但這裏是我想出來的:
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
下面的查詢將返回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');
yikes,我不知道從哪裏開始將這種語法翻譯成PL/SQL,不過很好! – ninesided 2010-04-01 10:02:17
hm現在沒有ORA,但是如果CONNECT BY能夠使用ROWNUM並終止它,那麼它可能類似於SELECT ROWNUM作爲sq,1作爲child,1作爲父FROM FROM通過之前的child = parent連接和rownum <= 20; (但我不認爲這可能是由於騎車造成的)http://www.adp-gmbh.ch/ora/sql/connect_by.html – Unreason 2010-04-01 12:45:57
好的工作不合理的是,CONNECT BY LEVEL語法聞起來像是一場勝利! – ninesided 2010-04-01 14:19:50