【PostgreSQL】西暦から和暦へ変換する
西暦から和暦へ変換する関数
西暦から和暦へ変換する関数です。
引数
引数1(date):変換する日付
返り値
和暦(和暦の頭文字+年月日)
例:1987/9/1 ⇒ S620901
コード
CREATE OR REPLACE FUNCTION convert_seireki_to_wareki(date)
RETURNS character varying AS
$BODY$
declare
begin
--$1:引数(変換する日付)
if $1 > '20190430' then
--令和
return 'R' || cast(to_char(cast($1 as date),'YYYYMMDD') as numeric) - 20180000;
elseif $1 > '19890107' then
--平成
return 'H' || cast(to_char(cast($1 as date),'YYYYMMDD') as numeric) - 19880000;
elseif $1 > '19261224' then
--昭和
return 'S' || cast(to_char(cast($1 as date),'YYYYMMDD') as numeric) - 19250000;
elseif $1 > '19120729' then
--大正
return 'T' || cast(to_char(cast($1 as date),'YYYYMMDD') as numeric) - 19110000;
elseif $1 > '18680124' then
--明治
return 'M' || cast(to_char(cast($1 as date),'YYYYMMDD') as numeric) - 18670000;
end if;
return null;
end;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
※PostgreSQL9.5 , 9.6 , 10 , 11 , 12で動作確認済み 自作関数の実行方法はこちら
実行例
select * From convert_seireki_to_wareki('1950/1/1'); --"S250101"
select * From convert_seireki_to_wareki('2000/1/1'); --"H120101"
※ 2020/11/24 追記
H12/01/01のようなスラッシュを入れた形式の関数を用意しました。
コード(結果にスラッシュを入れた形式)
CREATE OR REPLACE FUNCTION convert_seireki_to_wareki(date)
RETURNS character varying AS
$BODY$
declare
tmp character varying;
jpn_history character varying; -- 和歴
begin
--$1:引数(変換する日付)
if $1 > '20190430' then
--令和
tmp = cast(to_char($1,'YYYYMMDD') as numeric) - 20180000;
jpn_history = 'R';
elseif $1 > '19890107' then
--平成
tmp = cast(to_char($1,'YYYYMMDD') as numeric) - 19880000;
jpn_history = 'H';
elseif $1 > '19261224' then
--昭和
tmp = cast(to_char($1,'YYYYMMDD') as numeric) - 19250000;
jpn_history = 'S';
elseif $1 > '19120729' then
--大正
tmp = cast(to_char($1,'YYYYMMDD') as numeric) - 19110000;
jpn_history = 'T';
elseif $1 > '18680124' then
--明治
tmp = cast(to_char($1,'YYYYMMDD') as numeric) - 18670000;
jpn_history = 'M';
end if;
--return(スラッシュを入れた形式でリターン)
if length(tmp) = 6 then
return jpn_history || substring(tmp,1,2) || '/' || substring(tmp,3,2) || '/' || substring(tmp,5,2);
elseif length(tmp) = 5 then
return jpn_history || substring(tmp,1,1) || '/' || substring(tmp,2,2) || '/' || substring(tmp,4,2);
else
return null;
end if;
end;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
実行例
select * From convert_seireki_to_wareki('1950/1/1'); --"S25/01/01"
select * From convert_seireki_to_wareki('2000/1/1'); --"H12/01/01"
select * From convert_seireki_to_wareki('2020/3/1'); --"R2/03/01"