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

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

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

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

Q&A

2回答

1413閲覧

SQLでの時間取得について

退会済みユーザー

退会済みユーザー

総合スコア0

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

0グッド

0クリップ

投稿2020/11/05 14:34

SQLでの時間取得について、ご教示ください。

SQLで時間を取得し、最大17バイトのカラムに格納したいのですが、以下のSQLを実行したところエラーが発生しました。
取得した値を格納せずに表示したところ、見た目上では17バイトで表示されていました。

時間取得部分は以下の通りです。

SQL

1SELECT TO_CHAR(SYSTIMESTAMP(3),'YYYYMMDDHH24MISSFF3') FROM DUAL

エラー内容
行1でエラーが発生しました。:
ORA-12899: 列"テーブルA"."カラムA"の値が大きすぎます(実際:20、最大: 17)

#知りたいこと
•エラーに表示されているバイト数が17バイトにならない原因は何でしょうか。
•取得した時間の17バイトのみにするためには、どのようにすれば良いのでしょうか。

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

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

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

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

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

guest

回答2

0

「"テーブルA"."カラムA"の定義が、値より小さい」と言われているんだから、テーブル定義を直すしかありません。

文字数で意識した定義にしているなら、そのように定義する必要があります。
varchr2(17 char)のように桁が文字の数を表しているという、指定(char)が必要です

以下のSQLで作成された項目の定義を確認しました。
少なくともVarchar2(17)であれば大丈夫そうですが。

SQL

1create table test as 2select to_char(systimestamp(3),'YYYYMMDDHH24MISSFF3') dummy 3from dual

多分、現状ではchar(17)で定義しているんでしょうけど、char()指定の桁はあくまでバイト数なので、格納できる文字数は、文字コードの長さでまちまちです。

態々、文字型で定義しなくても、TIMESTAMP型で取る方が容量的には少なく済むし、利便性があると思いますけど。

訂正

列"テーブルA"."カラムA"の値が大きすぎます(実際:20、最大: 17)
実際で20バイトという事は内容的にマルチバイト文字で扱われている所がありそうなので、別な問題ですね。

解決するか分かりませんが、to_single_byteを挟んでみてはどうでしょうか。

SQL

1SELECT testtime 2 , length(testtime) 3 , lengthb(testtime) 4 , to_single_byte(testtime) 5 , length(to_single_byte(testtime)) 6 , lengthb(to_single_byte(testtime)) 7 , ASCIISTR (testtime) 8 , length(ASCIISTR (testtime)) 9 , lengthb(ASCIISTR (testtime)) 10from ( 11 select TO_CHAR(SYSTIMESTAMP(3),'YYYYMMDDHH24MISSFF3') testtime 12 FROM DUAL 13) test

手元の環境では20バイトにはなりませんが、上記を実行すれば確認はできると思います。
ASCIISTRも追加
timestamp型にすれば回避はできそうですが、根本的な解決ではありませんしね。

投稿2020/11/06 00:14

編集2020/11/06 01:20
sazi

総合スコア25327

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

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

0

現象を再現できる必要最小限のコードを提示しては?

SQL

1SQL> CREATE TABLE TAB_A(A VARCHAR2(17)); 2 3表が作成されました。 4 5SQL> INSERT INTO TAB_A(A) VALUES(TO_CHAR(SYSTIMESTAMP(3),'YYYYMMDDHH24MISSFF3')); 6 71行が作成されました。 8 9SQL> SELECT * FROM TAB_A; 10 11A 12---------------------------------- 1320201106023905605

Oracle18C, Windows10 Professional 64bit

投稿2020/11/05 17:42

Orlofsky

総合スコア16417

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問