昨日の後半「英語の月・曜日名の一覧を出すクエリ」の前にロケールのlc_timeを変更し、to_char関数の書式の先頭にTMを付けると、ローカライズされた月・曜日名になります。例えばTMDayなら「日曜日, 月曜日, …」。ただしクライアント側の文字コードやフォントも対応が必要。
日本語の例
以下、実行環境はWindows7 32bit + PostgreSQL 9.4。Linuxの場合、lc_timeに入力する言語をja_JPなどの形式にして下さい。詳細はLet's postgreの記事「ロケール(国際化と地域化)」を参照。
日本語の場合 ↓ 月名は「睦月、如月、弥生…」でなく普通の■月です。
SET lc_time TO 'Japanese'; -- change locale
SELECT month, to_char(concat, 'Month Mon'), -- English
to_char(concat, 'TMMonth TMMon') -- localized
FROM generate_series(1, 12) AS month,
cast(concat('2015-', month, '-1') AS date);
month | to_char | to_char
-------+---------------+---------
1 | January Jan | 1月 1
2 | February Feb | 2月 2
3 | March Mar | 3月 3
4 | April Apr | 4月 4
5 | May May | 5月 5
6 | June Jun | 6月 6
7 | July Jul | 7月 7
8 | August Aug | 8月 8
9 | September Sep | 9月 9
10 | October Oct | 10月 10
11 | November Nov | 11月 11
12 | December Dec | 12月 12
(12 行)
SET lc_time TO 'Japanese'; -- change locale
SELECT to_char(concat, 'Day Dy'), -- English
to_char(concat, 'TMDay TMDy') -- localized
FROM generate_series(1, 7) AS day,
cast(concat('2015-1-', day) AS date)
ORDER BY extract(isodow FROM concat);
to_char | to_char
---------------+-----------
Monday Mon | 月曜日 月
Tuesday Tue | 火曜日 火
Wednesday Wed | 水曜日 水
Thursday Thu | 木曜日 木
Friday Fri | 金曜日 金
Saturday Sat | 土曜日 土
Sunday Sun | 日曜日 日
(7 行)
中国語の例
月名は漢数字になるだけ、曜日名もShift JISの漢字で足りて、ロケール変更だけで済みました。月・曜日名のローカライズはOSによっても違うと思います。
SET lc_time TO 'Chinese';
SELECT month, to_char(concat, 'Month Mon'),
to_char(concat, 'TMMonth TMMon')
FROM generate_series(1, 12) AS month,
cast(concat('2015-', month, '-1') AS date);
month | to_char | to_char
-------+---------------+---------------
1 | January Jan | 一月 一月
2 | February Feb | 二月 二月
3 | March Mar | 三月 三月
4 | April Apr | 四月 四月
5 | May May | 五月 五月
6 | June Jun | 六月 六月
7 | July Jul | 七月 七月
8 | August Aug | 八月 八月
9 | September Sep | 九月 九月
10 | October Oct | 十月 十月
11 | November Nov | 十一月 十一月
12 | December Dec | 十二月 十二月
(12 行)
SET lc_time TO 'Chinese';
SELECT to_char(concat, 'Day Dy'),
to_char(concat, 'TMDay TMDy')
FROM generate_series(1, 7) AS day,
cast(concat('2015-1-', day) AS date)
ORDER BY extract(isodow FROM concat);
to_char | to_char
---------------+-------------
Monday Mon | 星期一 周一
Tuesday Tue | 星期二 周二
Wednesday Wed | 星期三 周三
Thursday Thu | 星期四 周四
Friday Fri | 星期五 周五
Saturday Sat | 星期六 周六
Sunday Sun | 星期日 周日
(7 行)
ドイツ語、フランス語の曜日名
ドイツ語での短縮形は2文字にするらしく、月曜がMo、金曜がFr、土曜がSaなど英語と結構似ています。フランス語の方はほとんど見当が付かない…。
SET lc_time TO 'German';
SELECT to_char(concat, 'Day Dy'),
to_char(concat, 'TMDay TMDy')
FROM generate_series(1, 7) AS day,
cast(concat('2015-1-', day) AS date)
ORDER BY extract(isodow FROM concat);
to_char | to_char
---------------+---------------
Monday Mon | Montag Mo
Tuesday Tue | Dienstag Di
Wednesday Wed | Mittwoch Mi
Thursday Thu | Donnerstag Do
Friday Fri | Freitag Fr
Saturday Sat | Samstag Sa
Sunday Sun | Sonntag So
(7 行)
SET lc_time TO 'French';
SELECT to_char(concat, 'Day Dy'),
to_char(concat, 'TMDay TMDy')
FROM generate_series(1, 7) AS day,
cast(concat('2015-1-', day) AS date)
ORDER BY extract(isodow FROM concat);
to_char | to_char
---------------+---------------
Monday Mon | Lundi Lun.
Tuesday Tue | Mardi Mar.
Wednesday Wed | Mercredi Mer.
Thursday Thu | Jeudi Jeu.
Friday Fri | Vendredi Ven.
Saturday Sat | Samedi Sam.
Sunday Sun | Dimanche Dim.
(7 行)
ドイツ語の月名(ウムラウト記号あり)を表示する例
3月だけウムラウトを含むMärzで、これを正常に表示できた手順をメモしておきます。フォント切替を楽にするため、普通のコマンドプロンプトでなくConEmuを使用(関連記事:6月7日)。まずConEmu上でchcp 1252を入力してコードページを変更した後、psqlを起動。日本語版Windowsのデフォルトのコードページ(932)と違うという警告が出ますが、そのまま続行。
chcp 1252
psql -U postgres
次にpsql上でクライアント側のエンコーディングをWIN1252に変更。後は、これまでと同様lc_timeを変えて月名一覧のクエリを投げます。この時点でフォントが対応してないとウムラウトがうまく表示されないと思いますが、続いてConEmuの設定画面でフォントを切り替えればOK。
SET client_encoding TO 'WIN1252';
SET lc_time TO 'German';
SELECT month, to_char(concat, 'Month Mon'),
to_char(concat, 'TMMonth TMMon')
FROM generate_series(1, 12) AS month,
cast(concat('2015-', month, '-1') AS date);
↓ ConEmuの設定画面で先頭のMainを開き、フォントをウムラウトを含む適当なもの(今回はCourier)に変えたら、リアルタイムでコンソールに反映され、ウムラウトがきちんと表示されました。Font charset(画像中の囲み)はドイツ語の場合ANSIが良いらしく、他のにしていると警告が出て、たぶん結果も変なはず。
このように(1)psql起動時のコードページ(2)クライアント側のエンコーディング(3)結果を表示するフォントの三つが揃って初めて、アルファベット以外を含むローカルな月名・曜日名を表示できます。手間が多いので余り使う機会がありませんが…。