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

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

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

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

PL/SQL

PL/SQL (Procedural Language/Structured Query Language) はOracle CorporationによるSQL(非手続き型言語)を手続き型言語に拡張させるために開発されたプログラミング言語です。

SQL

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

Q&A

解決済

2回答

3503閲覧

【Oracle・PL/SQL】正しく日付が取れないのは何故ですか?

kukku-zelda

総合スコア22

Oracle

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

PL/SQL

PL/SQL (Procedural Language/Structured Query Language) はOracle CorporationによるSQL(非手続き型言語)を手続き型言語に拡張させるために開発されたプログラミング言語です。

SQL

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

0グッド

0クリップ

投稿2018/05/22 08:55

編集2018/05/22 23:49

PL/SQLで日付を選択する処理を作ったのですが、正しく日付を取ることができません。

まず扱うデータをまとめます。

CREATE TABLE 商品構成マスタ(
商品コード VARCHAR2(3BYTE),
構成品 VARCHAR2(3BYTE),
適用開始日付 DATE,
個数 NUMBER(1,0)
)

INSERT INTO 商品構成マスタ VALUES ('AAA', '111', SYSDATE, 1)
INSERT INTO 商品構成マスタ VALUES ('AAA', '222', SYSDATE, 1)
INSERT INTO 商品構成マスタ VALUES ('AAA', '111', SYSDATE, 1)
INSERT INTO 商品構成マスタ VALUES ('AAA', '333', SYSDATE, 1)
INSERT INTO 商品構成マスタ VALUES ('AAA', '333', SYSDATE, 1)
INSERT INTO 商品構成マスタ VALUES ('AAA', '444', SYSDATE, 1)

【上記テーブルから日付を取得して別のテーブルに挿入するSQL】
INSERT INTO 適用開始日付セット
SELECT DISTINCT 適用開始日付
FROM 商品構成マスタ
WHERE 商品コード = 'AAA'
ORDER BY 適用開始日付;

【期待する値】
2018-02-01 00:00:00
2018-03-01 00:00:00
2018-03-20 00:00:00
(SYSDATEを挿入したのが、00:00:00だったとします。)

なのですが・・・
実際にテストしてみると、以下の様に値が挿入されてしまいます。

2018-02-01 14:32:04
2018-03-01 14:32:04
2018-03-20 14:32:04
(14:32:04は、実際に処理を動かした時間)

何故このような結果になってしまうかわかりません。
ご教授いただけないでしょうか?

また、回避する方法(期待する値になる方法)はございますでしょうか?

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

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

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

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

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

sazi

2018/05/22 09:06

商品構成マスタの適用開始日付の属性は何でしょう?
sazi

2018/05/22 09:09 編集

そのselectの結果確認は何で行われていますか?
kukku-zelda

2018/05/22 09:09

他のDBへ書き込む機能ですので、書き込んだ先のDBの値を確認しています。
Orlofsky

2018/05/22 09:10

CREATE TABLEと現状のテーブルに入っているデータをINSERTで提示されては?
sazi

2018/05/22 09:11

ではそのpl/sqlの全文を質問に追加されたほうが良さそうです。
kukku-zelda

2018/05/22 09:24

全文は載せられないので、テーブルに挿入する箇所を書きました。
guest

回答2

0

ベストアンサー

OracleではDATE型への設定は以下のように TO_DATEを使います。TO_DATEがないので暗黙の型変換が起きて、変なデータが入ってしまったのでしょう。今後はデータ型の扱いにシビアになってください。
文字列はシングルクォートで囲みます。

準備

SQL

1CREATE TABLE 商品構成マスタ( 2 商品コード VARCHAR2(3BYTE), 3 構成品 VARCHAR2(3BYTE), 4 適用開始日付 DATE, 5 個数 NUMBER(1,0) 6 ) ; 7 8INSERT INTO 商品構成マスタ VALUES ('AAA', '111', TO_DATE('2018-02-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), 1) ; 9INSERT INTO 商品構成マスタ VALUES ('AAA', '222', TO_DATE('2018-02-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), 1) ; 10INSERT INTO 商品構成マスタ VALUES ('AAA', '111', TO_DATE('2018-03-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), 1) ; 11INSERT INTO 商品構成マスタ VALUES ('AAA', '333', TO_DATE('2018-03-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), 1) ; 12INSERT INTO 商品構成マスタ VALUES ('AAA', '333', TO_DATE('2018-03-20 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), 1) ; 13INSERT INTO 商品構成マスタ VALUES ('AAA', '444', TO_DATE('2018-03-20 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), 1) ; 14COMMIT;

実行

SQL

1ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS' ; 2 3SELECT DISTINCT 適用開始日付 4FROM 商品構成マスタ 5WHERE 商品コード = 'AAA' 6ORDER BY 適用開始日付; 7 8適用開始日付 9------------------- 102018-02-01 00:00:00 112018-03-01 00:00:00 122018-03-20 00:00:00

追記
CREATE TABLEとSELECTの中に全角空白が入っています。半角空白を使ってください。
メモ帳でコードを書いているならエディタを使ってください。
有償ソフトの秀丸エディタなら全角空白を□で表示するようカスタマイズできます。
秀丸エディタで不可視文字を表示
サクラエディタでも同じ機能があったかも?

投稿2018/05/22 09:33

編集2018/05/22 15:44
Orlofsky

総合スコア16415

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

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

kukku-zelda

2018/05/22 23:45

回答ありがとうございます。 ご指摘いただいたところを修正しました。 元々入っていたデータを参照していたので、型変換で変なデータが入っていることはないと思います・・・ 質問欄のインサート文を使ってデータを入れていたわけではありません。 元々ある適用開始日付(商品構成マスタから選択)では2018-02-01 00:00:00となっていたのに、 セレクトインサートをした後のテーブルでは2018-02-01 起動した時刻 となっていました。 こうなってしまう理由をご存じでしょうか?
Orlofsky

2018/05/23 00:51 編集

現象を再現できる最低限のコードを提示できると適切なコメントが付きます。 では、ヒントを。 ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS' ; SELECT SYSDATE, TRUNC(SYSDATE) AS TRUNCD FROM DUAL ; SYSDATE TRUNCD ------------------- ------------------- 2018-05-23 09:32:35 2018-05-23 00:00:00
kukku-zelda

2018/05/23 04:40

ご回答、ありがとうございます。 引き続き調査してまいります。
guest

0

(SYSDATEを挿入したのが、00:00:00だったとします。)

この認識は誤りです。
SYSDATEは日付ではなく日時です。

時間部分を切り捨てるのは以下のようにします。

SQL

1INSERT INTO 商品構成マスタ VALUES ('AAA', '111', TRUNC(SYSDATE, 'DD'), 1)

この状態で確認してみて下さい。

SQL

1INSERT INTO 適用開始日付セット 2SELECT DISTINCT 適用開始日付 3FROM 商品構成マスタ 4WHERE 商品コード = 'AAA' 5ORDER BY 適用開始日付;

上記のSQLでinsert元のデータが勝手に加工されることはありません。
質問に含まれていないところに問題は含まれていると思います。

投稿2018/05/23 00:21

編集2018/05/23 00:28
sazi

総合スコア25138

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

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

kukku-zelda

2018/05/23 04:39

ご回答ありがとうございます。 引き続き、調査していこうと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問