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

過去5年間の12月31日と今日の日付のデータを取得します

    日付に常に深夜の時間要素があると仮定すると、次のようになります。

    SELECT *
    FROM   your_table
    WHERE  your_date_column IN (
             TRUNC( SYSDATE ),
             TRUNC( SYSDATE + INTERVAL '1' DAY, 'YYYY' ) - INTERVAL '1' DAY,
             ADD_MONTHS( TRUNC( SYSDATE + INTERVAL '1' DAY, 'YYYY' ) - INTERVAL '1' DAY, -12 ),
             ADD_MONTHS( TRUNC( SYSDATE + INTERVAL '1' DAY, 'YYYY' ) - INTERVAL '1' DAY, -24 ),
             ADD_MONTHS( TRUNC( SYSDATE + INTERVAL '1' DAY, 'YYYY' ) - INTERVAL '1' DAY, -36 ),
             ADD_MONTHS( TRUNC( SYSDATE + INTERVAL '1' DAY, 'YYYY' ) - INTERVAL '1' DAY, -48 )
           );
    

    (今日が12月31日の場合に合わせて、切り捨てる1日前に追加する必要があります)

    簡単な解決策は、TRUNCを使用することです。 日付に。

    SELECT *
    FROM   your_table
    WHERE  TRUNC( your_date_column ) IN (
             TRUNC( SYSDATE ),
             TRUNC( SYSDATE + INTERVAL '1' DAY, 'YYYY' ) - INTERVAL '1' DAY,
             ADD_MONTHS( TRUNC( SYSDATE + INTERVAL '1' DAY, 'YYYY' ) - INTERVAL '1' DAY, -12 ),
             ADD_MONTHS( TRUNC( SYSDATE + INTERVAL '1' DAY, 'YYYY' ) - INTERVAL '1' DAY, -24 ),
             ADD_MONTHS( TRUNC( SYSDATE + INTERVAL '1' DAY, 'YYYY' ) - INTERVAL '1' DAY, -36 ),
             ADD_MONTHS( TRUNC( SYSDATE + INTERVAL '1' DAY, 'YYYY' ) - INTERVAL '1' DAY, -48 )
           );
    

    ただし、列にインデックスを使用することはできず、TRUNC( your_date_column )に関数ベースのインデックスが必要になります。 インデックスを使用できるようにします。

    インデックスを使用できるより複雑なソリューションは次のとおりです。

    SELECT *
    FROM   your_table
    WHERE  ( your_date_column >= TRUNC( sysdate )
         AND your_date_column  < TRUNC( sysdate ) + INTERVAL '1' DAY
           )
    OR     ( your_date_column >= TRUNC( SYSDATE + INTERVAL '1' DAY, 'YYYY' ) - INTERVAL '1' DAY
         AND your_date_column  < TRUNC( SYSDATE + INTERVAL '1' DAY, 'YYYY' )
           )
    OR     ( your_date_column >= ADD_MONTHS( TRUNC( SYSDATE + INTERVAL '1' DAY, 'YYYY' ) - INTERVAL '1' DAY, -12 )
         AND your_date_column  < ADD_MONTHS( TRUNC( SYSDATE + INTERVAL '1' DAY, 'YYYY' ), -12 )
           )
    OR     ( your_date_column >= ADD_MONTHS( TRUNC( SYSDATE + INTERVAL '1' DAY, 'YYYY' ) - INTERVAL '1' DAY, -12 )
         AND your_date_column  < ADD_MONTHS( TRUNC( SYSDATE + INTERVAL '1' DAY, 'YYYY' ), -24 )
           )
    OR     ( your_date_column >= ADD_MONTHS( TRUNC( SYSDATE + INTERVAL '1' DAY, 'YYYY' ) - INTERVAL '1' DAY, -12 )
         AND your_date_column  < ADD_MONTHS( TRUNC( SYSDATE + INTERVAL '1' DAY, 'YYYY' ), -36 )
           )
    OR     ( your_date_column >= ADD_MONTHS( TRUNC( SYSDATE + INTERVAL '1' DAY, 'YYYY' ) - INTERVAL '1' DAY, -12 )
         AND your_date_column  < ADD_MONTHS( TRUNC( SYSDATE + INTERVAL '1' DAY, 'YYYY' ), -48 )
           );
    


    1. Oracle結合からAnsi結合への変換

    2. ExecuteNonQueryで影響を受ける行を取得する

    3. mySQLのNOTDISTINCTクエリ

    4. テーブル予約のための2つの日時間のSQLコマンド