先輩に聞く前に、
- まずよく考えみて、
- わからなければ調べて、
- それでもダメなら聞く、
という癖をつけないとなあ。厳しいぞ。
01 | /* Oracle PL/SQLで日付からその月の1日を求める*/ |
02 |
03 | /* to_date、to_charを使えるなら、考えればできる */ |
04 | create or replace function first_day(thedate date ) return date is |
05 | begin |
06 | return to_date(to_char(thedate, 'YYYY-MM' )|| '-01' , 'YYYY-MM-DD' ); |
07 | end ; |
08 |
09 | /* 調べてみれば、こっちがスマートだとわかる */ |
10 | create or replace function first_day(thedate date ) return date is |
11 | begin |
12 | return trunc(thedate, 'MONTH' ); |
13 | end ; |
14 |
15 | /***** ついでに *****/ |
16 |
17 | /* 年の最初の日 1月1日 */ |
18 | create or replace function first_day2(thedate date ) return date is |
19 | begin |
20 | return trunc(thedate, 'YEAR' ); |
21 | end ; |
22 |
23 | /* 週の始まり日曜日(※NLSの設定次第) */ |
24 | create or replace function first_day3(thedate date ) return date is |
25 | begin |
26 | return trunc(thedate, 'DAY' ); |
27 | end ; |
最後に問題。月の日数を求めるにはどうする?
NLSはクライアント単位でカスタムできちゃうので、勝手に変更されない保障があるのならNLS依存でも構わないと思います。(あるいはアプリ起動時にALTER SESSIONで毎回設定するとか)
お目汚し失礼しました。
thedate + (1 – to_char(thedate, ’D’))
とするとNLSに依存しないで週の頭の日付が取れるかもしれません。
ちゃんと検証してないのでアレですが。