2

みなさん、こんにちは。1年のすべての月の最初の日付を取得しようとしています。たとえば、Curretnの年が2012年で、次のようなクエリから次の結果を取得したい場合などです。

1-JAN-2012
1-FEB-2012
1-APR-2012
.
.
.
.
.
.
1-DEC-2012

よろしくお願いします。

4

4 に答える 4

5

完全を期すために、より単純なバージョンを次に示します。

select ADD_MONTHS(TRUNC(SYSDATE,'Y'),ROWNUM-1)
from dual connect by level <= 12;
于 2012-06-25T02:47:43.057 に答える
3

カレンダー表の方が使いやすいです。たとえば、私が働いている場所では、このクエリを実行するだけです。

select cal_date
from calendar
where year_of_date = 2012
  and day_of_month = 1;

クエリが明白であることについては、多くのことが言えます。

于 2012-06-23T11:25:33.527 に答える
2

以下をお試しください。日付形式/タイムゾーンを微調整したい場合があります

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)
于 2012-06-23T10:40:48.173 に答える
1

日付関数のみを使用して特定の年の値を取得する場合は、次を使用できます。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
于 2012-06-23T10:57:19.437 に答える