sql >> データベース >  >> RDS >> Oracle

ORACLESQLの日付列からすべての月のリストを作成します

    タイプミスをしてdateを書きました datesの代わりに ただし、2番目の変更を加えて、ADD_MONTHSを使用する必要もあります。 再帰クエリのWHEREで 句を使用しないと、生成される行が多すぎます。

    WITH t1(test)  AS (
      SELECT MIN(alldates)
      FROM dates 
    UNION ALL 
      SELECT ADD_MONTHS(test,1)
      FROM t1 
      WHERE ADD_MONTHS(test,1) <= (SELECT MAX(alldates) FROM dates)
    )
    SELECT * FROM t1
    

    どの出力:

    ただし、より効率的なクエリは、同じクエリで最小値と最大値を取得し、次の事前に見つかった境界を使用して反復することです。

    WITH t1(min_date, max_date)  AS (
      SELECT MIN(alldates),
             MAX(alldates)  
      FROM   dates 
    UNION ALL 
      SELECT ADD_MONTHS(min_date,1),
             max_date
      FROM   t1 
      WHERE  ADD_MONTHS(min_date,1) <= max_date
    )
    SELECT min_date AS month
    FROM   t1
    

    db <> fiddle こちら

    更新

    Oracle 11gR2には、再帰的な日付クエリを処理するバグがあります。これは後のOracleバージョンで修正されていますが、SQLFiddleとOracle11gR2を使用する場合は、日付ではなく数値を反復処理する必要があります。このようなもの:

    SQLフィドル

    Oracle11gR2スキーマのセットアップ

    CREATE TABLE dates(
    alldates date);
    
    INSERT INTO dates  (alldates) VALUES ('1-May-2017');
    INSERT INTO dates  (alldates) VALUES ('1-Mar-2018');
    

    クエリ1

    WITH t1(min_date, month, total_months)  AS (
      SELECT MIN(alldates),
             0,
             MONTHS_BETWEEN(MAX(alldates),MIN(alldates))
      FROM   dates 
    UNION ALL 
      SELECT min_date,
             month+1,
             total_months
      FROM   t1 
      WHERE  month+1<=total_months
    )
    SELECT ADD_MONTHS(min_date,month) AS month
    FROM   t1
    

    結果

    |                MONTH |
    |----------------------|
    | 2017-05-01T00:00:00Z |
    | 2017-06-01T00:00:00Z |
    | 2017-07-01T00:00:00Z |
    | 2017-08-01T00:00:00Z |
    | 2017-09-01T00:00:00Z |
    | 2017-10-01T00:00:00Z |
    | 2017-11-01T00:00:00Z |
    | 2017-12-01T00:00:00Z |
    | 2018-01-01T00:00:00Z |
    | 2018-02-01T00:00:00Z |
    | 2018-03-01T00:00:00Z |
    


    1. java.sql.SQLException:ORA-01652:表領域TEMPで一時セグメントを128拡張できません(拡張後も)

    2. MySQLのパラメータとして列名を渡す

    3. VARCHAR2を数値に変換する

    4. 複数のフィルターを使用してRESTAPIを設計するにはどうすればよいですか?