2016-09-30 36 views
0

過去12ヶ月の出荷データ(現在の月を除く)を動的に取得するクエリが必要です。 2016年9月30日の今日では、2015年9月1日から2016年8月31日までのデータが必要になります。明日はクエリが10-15から9-30-16の日付範囲に変更されます。Oracle SQL - 過去12ヶ月のデータ

WHERE (shipdate BETWEEN TRUNC(sysdate, 'Year') AND sysdate) 

このクエリでは、今日の日付の代わりに、過去12ヶ月までに完了暦年の初めからデータを引き出し:ここ

は、私が現在持っているものです。私は、MySQLとMS SQL Serverではこれに対する答えを見つけましたが、Oracleでは答えが見つかりませんでした。これはOracleでどのように達成できますか?

答えて

0
between add_months(trunc(sysdate, 'month'), -12) and trunc(sysdate, 'month') 

出荷が実際00:00:00 9月1日のタイムスタンプと正確深夜及び出荷にタイムスタンプすることができる場合は、次に、含まれるべきではない

shipdate >= add_months(trunc(sysdate, 'month'), - 12) 
           and shipdate < trunc(sysdate, 'month') 
に変更しなければならない「間」
+0

これには「01.09.2016 00:00:00」のデータが含まれていますが、これは望ましくありません – schurik

+0

実際のビジネスによって異なります。私は真夜中に誰も船がないと仮定しますが、それが問題であればあなたは正しいです。私はちょうどそれを反映するために投稿を編集しました。 – mathguy

+0

Mathguy、これは完全に機能しました。本当にありがとう!幸い、真夜中には何も出荷していないので、元のクエリを使用しました。 –

0

は最後の1000日たとえば、あなたが日付のリストを持つテーブルがあると言う:

create table tableTest(shipDate) as 
(
    select trunc(sysdate) - level +1 
    from dual 
    connect by level < 1000 
) 

次使用することができます。

select min(shipdate), max(shipdate) 
from tableTest 
where shipDate between trunc(add_months(sysdate, -12), 'MONTH') and TRUNC(sysdate, 'MONTH') -1 
+0

これは、8月31日の00:00:00以降の出荷を逃します。 "between"を使い、エンドポイントを調整したいのであれば、おそらくtrunc(sysdate、 'month')から1/86400(1秒) – mathguy

関連する問題