質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Oracle Database 11g

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

5回答

16099閲覧

西暦から和暦変換

Watanabe_ef

総合スコア28

Oracle Database 11g

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

1クリップ

投稿2015/11/18 08:06

編集2015/11/18 08:08

お世話になります。

タイトルの通り、SQLでの西暦→和暦変換の方法についてご教示をお願いします。

対象の項目は、「4271118」という値の持ち方をしています。
先頭の数字が年号を表しています。
1・・・明治
2・・・大正
3・・・昭和
4・・・平成
といった具合です。(よくある書き方なのでしょうが、一応)
上記のデータを、「4271118」→「平成27年11月18日」というように変換をしたいと思います。

今までは、nlsパラメータによる変換をしていましたが、この形も同じように変換できるのでしょうか。また、
できなければ、どのような方法で変換を行うかご教示ください。

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

ベストアンサー

ちょっと仕様は違いますが、Oracle7から和暦はサポートされています。

SQL> ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY/MM/DD' ;

セッションが変更されました。

SQL> SELECT SYSDATE, TO_CHAR(SYSDATE, 'EEYY"年"MM"月"DD"日"', 'NLS_CALENDAR = ''Japanese Imperial''') AS WAREKI FROM DUAL;

SYSDATE WAREKI


2015/11/18 平成27年11月18日

元号が変わったら、以下の手順で新しい元号を設定してください。
グローバリゼーション・サポート・ガイド
明日元号が変わるかもしれないので、和暦は使ってはなりません。

投稿2015/11/18 09:13

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Watanabe_ef

2015/11/18 09:57

回答ありがとうございます。 確かにその通りですね。西暦に変換後、そのような処理をするようにしたいと思います。
Orlofsky

2015/11/18 10:58

>西暦に変換後 直接和暦を西暦に変換できます。 SQL> ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY/MM/DD' ; セッションが変更されました。 SQL> WITH WAREKI_LIST(WAREKI) AS 2 ( 3 SELECT '1010908' AS WAREKI FROM DUAL UNION ALL 4 SELECT '2010730' FROM DUAL UNION ALL 5 SELECT '3011225' FROM DUAL UNION ALL 6 SELECT '4010108' FROM DUAL 7 ) 8 SELECT WL.WAREKI 9 , TO_DATE(CASE SUBSTR(WL.WAREKI, 1, 1) 10 WHEN '1' THEN 'M' 11 WHEN '2' THEN 'T' 12 WHEN '3' THEN 'S' 13 WHEN '4' THEN 'H' 14 END 15 || SUBSTR(WL.WAREKI, 2) 16 , 'EYYMMDD', 'NLS_CALENDAR = ''Japanese Imperial''') AS SEIREKI 17 FROM WAREKI_LIST WL ; WAREKI SEIREKI -------------- ---------- 1010908 1868/09/08 2010730 1912/07/30 3011225 1926/12/25 4010108 1989/01/08
Watanabe_ef

2015/11/18 11:11

回答ありがとうございます。 テストデータでわかりやすく教えていただき、ありがとうございます。 回答の通り作っていく方針にしましたので、ベストアンサーとさせていただきたいと 思います。まだまだ新人のですので、精進していきたいと思います。 ありがとうございました。
guest

0

投稿2019/04/02 00:20

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ご意見ありがとうございました。

かなり無理やりではありますが、一応望んだ結果が返りましたので、ご報告します。

SQL

1コード 2SELECT CASE SUBSTR('4271118',0,1) 3 WHEN '1' THEN '明治' 4 WHEN '2' THEN '大正' 5 WHEN '3' THEN '昭和' 6 WHEN '4' THEN '平成' 7 END || CONCAT(SUBSTR('4271118',2,2),'年') || 8 CONCAT(SUBSTR('4271118',4,2),'月') || 9 CONCAT(SUBSTR('42711118',6,2),'日') 10FROM DUAL; 11 12dual 13平成271118

このようになりました。
もっとスマートなやり方があれば、ご教示ください。よろしくお願いします。

投稿2015/11/18 09:03

Watanabe_ef

総合スコア28

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

SELECT
(CASE SUBSTR('4271118',1,1)
WHEN '4' THEN'平成'
WHEN '3' THEN '昭和'
WHEN '2' THEN '大正'
WHEN '1' THEN '明治'
END) || SUBSTR('4271118',2,2) || '年' || SUBSTR('4271118',4,2) ||'月' ||SUBSTR('4271118',6) || '日'
FROM DUAL;

投稿2015/11/18 09:03

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2015/11/18 09:03

'4271118'というリテラルはカラム名を設定してくださいね。
Watanabe_ef

2015/11/18 09:05

自己解決に書いている間にまったく同じ内容が・・・。 同じ考えの方がいてくださいましたので、安心しました。 回答ありがとうございました。
guest

0

関数を作っておけばいいのでは?
オラクルちょこっとリファレンス:HOME > FUNCTION編

投稿2015/11/18 08:22

dojikko

総合スコア3939

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Watanabe_ef

2015/11/18 08:31

回答ありがとうございます。 個人で作成しているものならよいのですが、複数人でのプロジェクトです。 関数を作るとなると、設計書等の見直しが必要になりますので、 できれば、新たに関数などを作成しないやり方がよいです。 ですが、関数を作成できるということは知りませんでしたので、よい勉強になりました。 別の機会で使用してみたいと思います。
Orlofsky

2015/11/18 21:06 編集

元号が変わったら、西暦→和暦、和暦→西暦 の部分をすべて直さなければなりません。 システムは作り易さも大切ですが、メンテナンスし易さの方に重点を置くべきです。 設計書の直しが面倒だからというのはモラルが低過ぎます。
Watanabe_ef

2015/11/18 11:08

回答ありがとうございます。 確かにその通りですね。 しかし、「関数をつくっておけばいいのでは?」 という回答だけでは、元号が変わったら西暦→和暦、和暦→西暦すべてを直さなければならないということに気づくことができませんでした。 まだまだ新人ですので、精進していきたいと思います。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問