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

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

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

Oracle Databaseは、米オラクルが開発・販売を行うリレーショナルデータベース管理システムです。

Q&A

解決済

1回答

6006閲覧

oracleでDATE型のレコードに時刻を登録する方法

screwsight

総合スコア9

Oracle Database

Oracle Databaseは、米オラクルが開発・販売を行うリレーショナルデータベース管理システムです。

0グッド

0クリップ

投稿2020/08/20 07:45

編集2020/08/20 14:03

oracleのDATE型は日付だけでなく時刻の情報も格納しているとのことですが、時刻を登録できません。
黒本(12cSQL基礎 初版2刷)のp.276には「DATE型:日付、時刻を含む固定長7バイトの日付データ型。4桁年、月、日、時、分、秒を格納します。」とありますが、年月日しか格納できませんでした。

「2000-01-01 00:00:00」や「2020-08-20 21:24:00」、「01-JAN-00 00:00:00」のような形で格納されると思っていたのですが違うのでしょうか?

【したこと】
(1) Oracle Live SQLで以下のSQLを実行してDATE型の列を持つsampleテーブルを作成

sql

1CREATE TABLE sample( 2 regdate date 3);

(2-1)以下の各SQLを実行してレコードを登録

sql

1 INSERT INTO sample VALUES ('15-Apr-00'); 2 INSERT INTO sample VALUES ('15-Apr-01'); 3 INSERT INTO sample VALUES (sysdate);

(2-2)以下の各SQLを実行してレコードを登録しようとしたがエラーで登録できなかった。

sql

1INSERT INTO sample VALUES ('15-Apr-00 00:00:00'); 2INSERT INTO sample VALUES ('15-Apr-01 00:00:00');

エラー文は以下:

date format picture ends before converting entire input string ORA-06512: at "SYS.DBMS_SQL", line 1721

(3)以下のSQLを実行。
想定結果:時刻はデフォルトで「00:00:00」が登録されるはずなので「15-Apr-00」「15-Apr-01」が抽出される。
実際の結果:「15-Apr-00」の1行だけ表示された。
また、sampleテーブルのcolumnsを確認するとLengthは7で「 00:00:00」は格納されていなかった。

sql

1SELECT * FROM sample WHERE regdate LIKE '%00%';

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

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

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

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

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

Orlofsky

2020/08/20 08:32 編集

この程度のことは実際にSQLを実行して動作確認しましょう。そうしないと身に付きません。 ちなみに、 SQL> SELECT TO_DATE('19-DEC-00', 'DD-MON-RR') FROM DUAL ; SELECT TO_DATE('19-DEC-00', 'DD-MON-RR') FROM DUAL * 行1でエラーが発生しました。: ORA-01843: 指定した月が無効です。
screwsight

2020/08/20 12:51

ORACLEの実行環境がなかったので編集前のような質問をしてしまいましたが仰るとおりですね。 Oracle Live SQLという試し打ちができる場所を見つけましたので自分で試したことの追記他、全体を編集いたしました。
screwsight

2020/08/20 20:46

ご指摘をもとに編集しました。
guest

回答1

0

ベストアンサー

sqlplusから実行する場合は

SQL

1ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY/MM/DD HH24:MI:SS' ;

を実行してからSELECTしてください。
それでだいたいわかるかと。

投稿2020/08/20 13:44

Orlofsky

総合スコア16415

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

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

screwsight

2020/08/20 14:12 編集

遅くまで付き合ってくださりありがとうございます。 上記のSQLを実行後、(3)のSQLを再度実行したところ当初の想定結果どおり「15-Apr-00」「15-Apr-01」が'YYYY/MM/DD HH24:MI:SS'形式で抽出されました。設定変更すれば時刻も格納できるがデフォルトは年月日のみ格納する設定になっている、ということでしょうか。 それと申し訳ございません、最初のご指摘の「ちなみに」以下で何を仰りたいのかわかりませんでした。 もしよろしければ解説いただけませんでしょうか。
Orlofsky

2020/08/20 21:19

DATE型というのは +1 で翌日、 -1 で前日を取得できます。つまり、 +1/24 で1時間後、 +1/60/24 で1分後、+1/60/60/24 で1秒後、etc. ALTER SESSION ... はsqlplusでのDATE型のデフォルトの書式マスクを指定します。実際にSELECTしたDATE型列に 時分秒が0以外でも関係ありません。SQLを実行して確認してください。 ちなみに はわたしは実務では 15-Apr-00 って書式でSQLを見たことも書いたことはありません。(原文が英語のアメリカの)マニュアルにはありますが。 暗黙の型変換に頼ってはなりません。TO_DATE, TO_CHAR を使って 文字型 ←→ DATE型を明示的に型変換してください。 実務では大量のデータを扱いますから、暗黙の型変換に気が付かないで大幅にパフォーマンスが落ちて使いものにならないことは良くあります。
Orlofsky

2020/08/20 21:34

日本で使うなら、 YYYY/MM/DD or YYYY-MM-DD でコードを書くのが一般的です。RR は生年月日、生命保険、住宅ローンなど長期間のスパンのあるデータで使うと事故の元であるこは理解しておいてください。 Oracle Database を勉強するならhttps://qiita.com/nakaie/items/2e383d4916530dce6a4f が無償で使えます。 Oracle18C EX なら、Win環境では Windows10 Professional, 64bit など動作保証されているPCを用意してください。https://docs.oracle.com/cd/E96517_01/ntdbi/oracle-database-software-requirements.htm#GUID-CEF225E9-9600-4E01-AC6F-402B562385F8
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問