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

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

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

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

SQL

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

Q&A

解決済

4回答

2385閲覧

SQLで文字列の部分抽出

yamaguti

総合スコア185

Oracle

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

SQL

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

0グッド

0クリップ

投稿2018/03/12 08:11

日付の修正

お世話になります。

Oracleのデータベースにてデータの移行を行っております。
手法としては、csvファイルを一旦中間テーブルにインポートし
中間テーブルにてデータを整形し、本テーブルへinsertします。

そのときにこのような日付型のカラムがあります。

 ```テーブル

更新日
2018/1/1 15:00
2017/11/1 15:00
2017/11/11 15:00
-
2017/1/10 15:00

やりたいことは日付のみを抽出してinsertを行いたいのですが 下記方法ですと  ```SQL SELECT TO_CHAR(TO_DATE(DATA_DATE, 'yyyy/mm/dd'), 'yyyy/mm/dd') FROM CONVER_K_KIHON_KABUKA WHERE DATA_DATE != '-';

ORA-01830: 日付書式の変換で不要なデータが含まれていますとなります。

またsubstrで抽出することも考えましたが、日付部分は桁数が固定でない為
区切ることができません。しかし時間部分はすべて5桁で固定されている為
そこからの抽出は可能とは思います。
しかし後ろから○桁という抽出方法は分かるのですが、取り除く方法がわかりませんご教示頂けますでしょうか。

宜しくお願い致します。

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

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

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

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

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

guest

回答4

0

日付型に変換できないものは除外して、細かいところは型変換に面倒見てもらうとか。

SQL

1SELECT 2 to_char(cast(DATE_DATE as date), 'yyyy/mm/dd') 3FROM 4 CONVER_K_KIHON_KABUKA 5WHERE 6 DATA_DATE != '-';

投稿2018/03/12 09:21

sazi

総合スコア25138

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

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

0

データの信頼性が低いのが敗因ですが、FUNCTIONを使っては?

PL/SQL

1CREATE OR REPLACE FUNCTION STRING_TO_DATE 2 ( 3 IN_STRING IN VARCHAR2 4 ) 5 RETURN DATE 6IS 7BEGIN 8 RETURN(TO_DATE(IN_STRING, 'YYYY/MM/DD HH24:MI')) ; 9EXCEPTION 10 WHEN OTHERS THEN 11 BEGIN 12 RETURN(TO_DATE(IN_STRING, 'YYYY/MM/D HH24:MI')) ; 13 EXCEPTION 14 WHEN OTHERS THEN 15 BEGIN 16 RETURN(TO_DATE(IN_STRING, 'YYYY/M/DD HH24:MI')) ; 17 EXCEPTION 18 WHEN OTHERS THEN 19 BEGIN 20 RETURN(TO_DATE(IN_STRING, 'YYYY/M/D HH24:MI')) ; 21 EXCEPTION 22 WHEN OTHERS THEN 23 -- cannot convert date 24 RETURN(NULL) ; 25 -- RAISE ; 26 END ; 27 END ; 28 END ; 29END STRING_TO_DATE ; 30/

-- 使用例

SQL

1ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY/MM/DD HH24:MI:SS' ; 2WITH DATE_LIST AS 3 ( 4 SELECT '2018/1/1 15:00' AS DATA_DATE FROM DUAL UNION ALL 5 SELECT '2017/11/1 15:00' FROM DUAL UNION ALL 6 SELECT '2017/11/11 15:00' FROM DUAL UNION ALL 7 SELECT '2017/1/10 15:00' FROM DUAL 8 ) 9SELECT 10 DL.DATA_DATE 11 , STRING_TO_DATE(DL.DATA_DATE) 12FROM DATE_LIST DL 13WHERE 14 DL.DATA_DATE != '-'; 15 16-- 結果 17DATA_DATE STRING_TO_DATE(DL.D 18-------------------------------- ------------------- 192018/1/1 15:00 2018/01/01 15:00:00 202017/11/1 15:00 2017/11/01 15:00:00 212017/11/11 15:00 2017/11/11 15:00:00 222017/1/10 15:00 2017/01/10 15:00:00 23 244行が選択されました。

投稿2018/03/12 08:54

編集2018/03/12 09:03
Orlofsky

総合スコア16415

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

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

0

ベストアンサー

スペースまでの文字数を検索して、
その文字列でsubstrすればいいと思うので、、、

SQL

1SELECT 2 substr(DATE_DATE, 1, instr(DATE_DATE, ' ')) 3FROM 4 CONVER_K_KIHON_KABUKA 5WHERE 6 DATA_DATE != '-';

といった感じでいけないでしょうか。

あと以下のようなストアドプロシージャ作れば一発ですね。
https://www.shift-the-oracle.com/sql/functions/strtoken.html

投稿2018/03/12 08:40

szk.

総合スコア1400

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

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

0

空白を区切り文字として分割してしまえばいいのではないでしょうか。

投稿2018/03/12 08:39

編集2018/03/12 08:42
bassbone

総合スコア767

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問