OracleでFIRST_DAY

先輩に聞く前に、

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

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

/* Oracle PL/SQLで日付からその月の1日を求める*/

/* to_date、to_charを使えるなら、考えればできる */
create or replace function first_day(thedate date) return date is
begin
    return to_date(to_char(thedate,'YYYY-MM')||'-01','YYYY-MM-DD');
end;

/* 調べてみれば、こっちがスマートだとわかる */
create or replace function first_day(thedate date) return date is
begin
    return trunc(thedate,'MONTH');
end;

/***** ついでに *****/

/* 年の最初の日 1月1日 */
create or replace function first_day2(thedate date) return date is
begin
    return trunc(thedate,'YEAR');
end;

/* 週の始まり日曜日(※NLSの設定次第) */
create or replace function first_day3(thedate date) return date is
begin
    return trunc(thedate,'DAY');
end;

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

Related posts:

  1. Oracle PL/SQLとUNIXタイムスタンプ
  2. 消費税を計算するOracle PL/SQLパッケージ
  3. Pythonで月末、月初。ついでに月を加減するadd_months
  4. 半角全角関係のOracle ストアドファンクション
  5. ユーザ管理をするOracle PL/SQLパッケージ

2 Comments

  • 1970年1月1日(木曜日) - 09:00 | Permalink

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

  • 2008年3月12日(水曜日) - 22:35 | Permalink

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

  • コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

    *

    次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>