スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

PL/pgSQLで月の第何回、何曜日の日を求める

第一月曜日とか第三水曜日だとか、毎月訪れるイベントみたいのがあるとすると、システムでは実際の日付を知る必要があります。
それをPL/pgSQLの関数で作成してみました。
最初の引数は基準となる日付です。年月だけを利用します。
二番目の引数は第一とか第二とかの数です。5以上与えると次月になる可能性があるので、注意が必要です。
また0を与えると、その月の最終を意味します。
三番目の引数は曜日です。0が日曜日で6が土曜日になります。

CREATE OR REPLACE FUNCTION uv_get_order_week(
p_ts timestamp with time zone
,p_order int
,p_week int
) RETURNS timestamp with time zone AS $$
DECLARE
w_ts timestamp with time zone;
w_dow int;
w_day int;
BEGIN
IF 0 = p_order THEN
w_ts := uv_get_last_day_of_month(p_ts);
w_dow := date_part('dow', w_ts);
w_day := p_week - w_dow;
IF w_dow < p_week THEN
w_day := w_day -7;
END IF;
ELSE
w_ts := uv_get_first_day_of_month(p_ts);
w_dow := date_part('dow', w_ts);
w_day := 7 * (p_order - 1) + p_week - w_dow;
IF w_dow > p_week THEN
w_day := w_day + 7;
END IF;
END IF;
RETURN uv_add_time(w_ts, w_day, 'day');
END;
$$ LANGUAGE plpgsql;

使用例
select uv_get_order_week('2010-02-01', 1, 0)
"2010-02-07 00:00:00+09"

select uv_get_order_week('2010-02-01', 2, 4)
"2010-02-11 00:00:00+09"

select uv_get_order_week('2010-02-01', 0, 1)
"2010-02-22 00:00:00+09"

一行入魂サイトにまとめがあります。
スポンサーサイト

COMMENTS

COMMENT FORM

TRACKBACK


この記事にトラックバックする(FC2ブログユーザー)

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。