OracleでFIRST_DAY

先輩に聞く前に、

  • まずよく考えみて、
  • わからなければ調べて、
  • それでもダメなら聞く、

という癖をつけないとなあ。厳しいぞ。

01/* Oracle PL/SQLで日付からその月の1日を求める*/
02 
03/* to_date、to_charを使えるなら、考えればできる */
04create or replace function first_day(thedate date) return date is
05begin
06    return to_date(to_char(thedate,'YYYY-MM')||'-01','YYYY-MM-DD');
07end;
08 
09/* 調べてみれば、こっちがスマートだとわかる */
10create or replace function first_day(thedate date) return date is
11begin
12    return trunc(thedate,'MONTH');
13end;
14 
15/***** ついでに *****/
16 
17/* 年の最初の日 1月1日 */
18create or replace function first_day2(thedate date) return date is
19begin
20    return trunc(thedate,'YEAR');
21end;
22 
23/* 週の始まり日曜日(※NLSの設定次第) */
24create or replace function first_day3(thedate date) return date is
25begin
26    return trunc(thedate,'DAY');
27end;

最後に問題。月の日数を求めるにはどうする?

OracleでFIRST_DAY」への2件のフィードバック

  1. NLSはクライアント単位でカスタムできちゃうので、勝手に変更されない保障があるのならNLS依存でも構わないと思います。(あるいはアプリ起動時にALTER SESSIONで毎回設定するとか)
    お目汚し失礼しました。

  2. thedate + (1 – to_char(thedate, ’D’))
    とするとNLSに依存しないで週の頭の日付が取れるかもしれません。
    ちゃんと検証してないのでアレですが。

コメントは停止中です。