2017-09-14 13 views
2

私は今から過去10日間を取得する必要があります 私は現在、過去10日間の日付を取得するためにOracle SQLクエリーを持っています。Oracle get last 10 days 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

をそれをサポートしません。このような場合は、再帰的なクエリを書くことができます。 '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()を使用しても(階層問合せを使用して、クエリと同じ結果を得ることができます1日の始まりの深夜までの日付):

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

または、再帰サブクエリのファクタリング句を使用します。「あなたは `VALUES`節(http://modern-sql.com/feature/values)のようなものを探していますが、Oracleはまだdoesnの

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