PostgreSQL 数値(yyyymmdd)を日付に変換する

PostgreSqlで曜日を表すカラムを数値型(yyyymmdd形式)で作成する場合があります。それを日付に変換する方法を紹介します。

SQL文

SQL分
1
2
3
4
5
6
7
select ymd
     , to_char(to_date(to_char(ymd, '00000000'), 'YYYYMMDD'), 'YYYY年MM月DD日')
       || '(' ||
       (ARRAY['日','月','火','水','木','金','土'])[extract('dow' FROM to_date(to_char(ymd, '00000000'), 'YYYYMMDD')) + 1]
       || ')' as str_ymd
from t_test
order by id
元のテーブル







SQL文の結果
無事に数値型の列が文字型の日付に変換されています。









しかし毎回、上記のようなSQL文を書くのも面倒なので、functionを作成して使用するのが便利かもしれません。

function

関数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
-- 日付変換関数
create or replace function f_ymdntos(n_ymd integer)
returns varchar as $$
declare
    s_ymd varchar;
    s_weekday varchar;
begin
    -- 日付部分作成
    select into s_ymd to_char(to_date(to_char(n_ymd, '00000000'), 'YYYYMMDD'), 'YYYY年MM月DD日');
  
    -- 曜日作成
    select into s_weekday (array['日','月','火','水','木','金','土'])[extract(dow from to_date(to_char(n_ymd, '00000000'), 'YYYYMMDD')) + 1];
  
    return s_ymd || '(' || s_weekday || ')';
end;
$$ language 'plpgsql'
;

作成したファンクションを利用した結果です。
結果
1
2
3
4
5
6
7
8
9
10
11
select id
     , ymd
     , to_char(to_date(to_char(ymd, '00000000'), 'YYYYMMDD'), 'YYYY年MM月DD日')
       || '(' ||
       (ARRAY['日','月','火','水','木','金','土'])[extract('dow' FROM to_date(to_char(ymd, '00000000'), 'YYYYMMDD')) + 1]
       || ')' as str_ymd
     , f_ymdntos(ymd) as str_ymd2
from t_test
order by id

SQL文は短くなりすっきりしました。結果も同じですね。









他にもfunctionに引数を追加して、日付フォーマットを指定できるようにすれば、汎用性を増すことができます。試してみてください。


コメント

人気の投稿