みなさん、こんにちは。1年のすべての月の最初の日付を取得しようとしています。たとえば、Curretnの年が2012年で、次のようなクエリから次の結果を取得したい場合などです。
1-JAN-2012
1-FEB-2012
1-APR-2012
.
.
.
.
.
.
1-DEC-2012
よろしくお願いします。
完全を期すために、より単純なバージョンを次に示します。
select ADD_MONTHS(TRUNC(SYSDATE,'Y'),ROWNUM-1)
from dual connect by level <= 12;
カレンダー表の方が使いやすいです。たとえば、私が働いている場所では、このクエリを実行するだけです。
select cal_date
from calendar
where year_of_date = 2012
and day_of_month = 1;
クエリが明白であることについては、多くのことが言えます。
以下をお試しください。日付形式/タイムゾーンを微調整したい場合があります
select to_date('2012/'||l||'/01', 'yyyy/mm/dd')
from (select level l from dual connect by level < 13)
編集: コメントの op で提供されているように、ハードコーディングするのではなく、現在の年を取得する必要があります。更新されたクエリは
SELECT L || '/01/' || TO_CHAR (SYSDATE, 'YYYY') DATESS FROM
(SELECT LEVEL L FROM DUAL CONNECT BY LEVEL < 13)
日付関数のみを使用して特定の年の値を取得する場合は、次を使用できます。SQLフィドルも使用できます。
select add_months(trunc(last_day(add_months(trunc(to_date('2011'
,'yyyy')
, 'y')
, -1)
) + 1
)
, level - 1)
from dual
connect by level <= 12
これにより、「年」が日付に変換され、デフォルトでその年の現在の日付が返されるため、 1月1日まで切り捨てられます。to_date('2011', 'yyyy')
次に、1か月を削除して、 2010年12月1日に移動します。Getはその月の最後の日である12月31日で、1日を追加します。したがって、1月1日に戻りますが、aを実行して、つまりconnect by level
を追加します。level - 1
正しい日を返すために1月に0。
first_day
残念ながら、Oracleにはこれをはるかに簡単にする関数がありません。
今年もほぼ同じです。
select add_months(trunc(last_day(add_months(trunc(sysdate,'y'),-1)) + 1), level - 1)
from dual
connect by level <= 12