2017-09-14 89 views
2

我需要從現在開始獲得最近10天 我目前有如下Oracle sql查詢來獲取最後10個日期。Oracle獲得最後10天sql

WITH DATES AS (
    SELECT sysdate - 10 AS value_date FROM dual 
    UNION 
    SELECT sysdate - 9 AS value_date FROM dual 
    UNION 
    SELECT sysdate - 8 AS value_date FROM dual 
    UNION 
    SELECT sysdate - 7 AS value_date FROM dual 
    UNION 
    SELECT sysdate - 6 AS value_date FROM dual 
    UNION 
    SELECT sysdate - 5 AS value_date FROM dual 
    UNION 
    SELECT sysdate - 4 AS value_date FROM dual 
    UNION 
    SELECT sysdate - 3 AS value_date FROM dual 
    UNION 
    SELECT sysdate - 2 AS value_date FROM dual 
    UNION 
    SELECT sysdate - 1 AS value_date FROM dual 
    UNION 
    SELECT sysdate  AS value_date FROM dual 
    UNION 
    SELECT sysdate + 1 AS value_date FROM dual 

但我想要一個更正確和有效的方式來獲得過去10個日期。聯合查詢看起來很髒。 如何在Oracle SQL中執行此操作?

+1

您正在尋找的東西,如'VALUES'條款(http://modern-sql.com/feature/values),但甲骨文仍然沒有按」不支持它。如果你喜歡,你可以編寫一個遞歸查詢。比'UNION'查詢更好。順便說一下,它應該是'UNION ALL',因爲沒有重複刪除 - 不要給DBMS更多的工作要做。 –

回答

3

使用了更緊湊的等效採用CONNECT BY子句:

SELECT trunc(sysdate) - level + 2 
FROM dual 
CONNECT BY rownum <= 12 

演示:http://sqlfiddle.com/#!4/a50e25/5

| TRUNC(SYSDATE)-LEVEL+2 | 
|------------------------| 
| 2017-09-15T00:00:00Z | 
| 2017-09-14T00:00:00Z | 
| 2017-09-13T00:00:00Z | 
| 2017-09-12T00:00:00Z | 
| 2017-09-11T00:00:00Z | 
| 2017-09-10T00:00:00Z | 
| 2017-09-09T00:00:00Z | 
| 2017-09-08T00:00:00Z | 
| 2017-09-07T00:00:00Z | 
| 2017-09-06T00:00:00Z | 
| 2017-09-05T00:00:00Z | 
| 2017-09-04T00:00:00Z | 
+0

這工作,謝謝! – dekritikaster

1

你可以得到相同的結果,使用分層查詢您的查詢(也使用TRUNC()截斷在一天開始時的午夜時間):

SELECT TRUNC(SYSDATE) - 11 + LEVEL 
FROM DUAL 
CONNECT BY LEVEL <= 12 

,或者使用遞歸子查詢保條款:

WITH days (dt) AS (
    SELECT TRUNC(SYSDATE) - 10 FROM DUAL 
UNION ALL 
    SELECT dt + 1 FROM days WHERE dt <= SYSDATE 
) 
SELECT dt FROM days