スポンサーサイト

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

PL/pgSQLで日本語の曜日に対応したTO_CHAR

PostgreSQLのTO_CHARでは、フォーマットにDayでSunday, Monday、DAYでSUNDAY, MONDAY、DyでSun, Mon、DYでSUN, MONが取得できます。
例えば

SELECT TO_DATE(NOW(), 'YYYY/MM/DD(Day)')
→'2010/04/21(Wednesday)

ですが、日本語で2010/04/21(水)と返してほしいものです。
ということでPL/pgSQLで作りました。
曜日っぽいアルファベットをごりっと書き換えています。


CREATE OR REPLACE FUNCTION uv_to_char (
p_ts TIMESTAMP WITH TIME ZONE
,p_format TEXT
,p_dow TEXT DEFAULT '日,月,火,水,木,金,土'
) RETURNS TEXT AS $$
DECLARE
w_result TEXT := TO_CHAR(p_ts, p_format);
w_dow_ary1 TEXT[] := string_to_array(p_dow, ',');
w_dow_ary2 TEXT[] := ARRAY['Sun|Sunday ','Mon|Monday ','Tue|Tuesday ','Wed|Wednesday','Thu|Thursday ','Fri|Friday ','Sat|Saturday '];
w_count int := array_length(w_dow_ary1, 1);
BEGIN
FOR i IN 1..w_count LOOP
w_result := regexp_replace(w_result, w_dow_ary2[i], w_dow_ary1[i], 'ig');
END LOOP;
return w_result;
END;
$$ LANGUAGE plpgsql;


実行すると以下のようになります。

-- 日本語版
SELECT uv_to_char(NOW(), 'YYYY/MM/DD(Day)')
→'2010/04/21(水)

-- 中国語版
SELECT uv_to_char(NOW(), 'YYYY/MM/DD(Day)', '星期日,星期一,星期二,星期三,星期四,星期五,星期六')
→'2010/04/21(星期三)


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

追記.2010.04.21.14
英語の曜日に余計な空白が付いてくるので、それを削除するように変更
スポンサーサイト
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。