【PostgreSQL】西暦から和暦へ変換する

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"

 

PostgreSQLの構文まとめを書いています

入門~経験者まで「基本構文・こんな時どう書くんだっけ?」のまとめ