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

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

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

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Oracle

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

SQL

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

Q&A

解決済

3回答

5375閲覧

C#を使用したバッチプログラム中で日付型の変換方法

kyon9haruhi1

総合スコア7

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Oracle

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

SQL

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

0グッド

0クリップ

投稿2017/03/03 05:53

編集2017/03/03 07:34

###前提・実現したいこと
C#でバッチプログラムを作成しています。
SQLでUPDATE文を書いているのですが、DBに登録されている日付型がyyyy/MM/dd形式で、プログラム中で下記のソースコードを実行すると時間まで入ってしまいます。
そのまま処理を実行するとyyyy/MM/dd hh:mm:ssで登録しようとし、DBの日付書式と登録しようとしている書式が異なるためエラーが出ているようです。

yyyy/MM/dd形式のDATE型を作成し、DBに登録したいです。

エラーメッセージ

(log4net)ERROR=[呼び出しのターゲットが例外をスローしました。]
Exception: System.Reflection.TargetInvocationException
Message: 呼び出しのターゲットが例外をスローしました。
Source: mscorlib
場所 System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner)
場所 System.RuntimeMethodHandle.InvokeMethodFast(Object target, Object[] arguments, Signature sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner)
場所 System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
場所 System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
場所 System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters)
場所 FlowCtlLib.FlowControler._executeJob(JOB ctlJob)
場所 FlowCtlLib.FlowControler.ExecuteFlow(JOBS ctlJobs)
場所 FlowCtlLib.FlowControler.ExecuteFlow(FLOW ctlFlow)
場所 FlowCtlLib.FlowControler.Execute(String flowControlFilePath, String FlowID)

Nested Exception

Exception: System.Data.OracleClient.OracleException
Message: ORA-01861: リテラルが書式文字列と一致しません

###該当のソースコード
言語はC#です。
下記ソースの前にパラメータを宣言しています。

C#

1hntknsb = hnt["YMD"].ToString();//日付の文字列を取得(yyyyMMdd) 2hntknsb = hntknsb.Insert(4, "/").Insert(7, "/");//スラッシュを挿入する(yyyy/MM/dd) 3hnt_knsb = DateTime.ParseExact(hntknsb, "yyyy/MM/dd", System.Globalization.CultureInfo.InvariantCulture);//日付型に変換 4

上記ソースの後にパラメータに値をセットし、SQLを実行しています。
###試したこと

SQLのTO_DATE文等の使い方がよくわかっておらず、時間も限られているので質問させて頂きました。
/を入れただけの文字列をSQLに渡してSQL側で日付型に変換すれば登録できるのでしょうか…?

宜しくお願いします。

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

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

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

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

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

guest

回答3

0

ORA-01861: リテラルが書式文字列と一致しません

リンク先に対処法が載っていますが、日付型はもともと秒数を含んでいますので文字列さえ既定のものを与えてやれば大丈夫です。

投稿2017/03/03 06:17

Zuishin

総合スコア28660

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

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

kyon9haruhi1

2017/03/03 06:33

デバッグで登録直前の値を見てみたのですが、2017/02/24 0:00:00となっていました。 私も自動的に時間以降は切り捨てられて年月日だけ登録できるのかと思っていたのですが、このデータ内容では登録はできないのでしょうか…? C#はあまり触ったことがなくよくわかっていないのです… 申し訳ない…
Zuishin

2017/03/03 06:35

いえ、内容は問題ありません。書式だけの問題です。リンク先をご覧になりましたか? どうすればいいのか書いてあります。 C# の知識も関係ありません。必要なのは ORACLE の知識です。
Zuishin

2017/03/03 06:50 編集

誰がデータベースの管理者ですか? お急ぎであれば手っ取り早く設定した人に書式を教えてもらってください。
kyon9haruhi1

2017/03/03 07:15

課題管理票に質問事項記載して待ちます。 単純にyyyy/MM/dd形式に変換して登録することはできないのでしょうか?
Zuishin

2017/03/03 08:36

設定次第です。
guest

0

ベストアンサー

/を入れただけの文字列をSQLに渡してSQL側で日付型に変換すれば登録できるのでしょうか…?

datetime型で得た値を文字列で取り込むとき、ToShortDateString()で行えば時間のない文字列ができると思います。

dt = DateTime.Now; string ds = dt.ToShortDateString();

dsには年月日が入ります。
SQLのほうへは適正に変換して吐き出せばいいかと。

投稿2017/03/03 07:13

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

kyon9haruhi1

2017/03/03 07:32

ありがとうございます。 20170303という文字列を取得し、DateTime型に変換するには年月日それぞれの間に/を入れなければならないと見ました。 2017/03/03という文字列を作成した後、このままDate型に変換できないものでしょうか… 現状では2017/03/03 0:00:00というように時間まで自動的に追加されてしまいます。 このままDBに登録しようとすると ORA-01861: リテラルが書式文字列と一致しません とエラーが出てしまう状況です。 文字列→スラッシュ入り文字列→日付型(yyyy/MM/dd)と変換したいもしくは間のプロセスを増やしても減らしても構いません。 お知恵をお貸しください…
退会済みユーザー

退会済みユーザー

2017/03/03 07:40

変換すると'/'が含まれた形式になると思っています。私の場合はmysqlを使っていて、たしかYYYY-MM-DDだったのでさらにReplaceで変換していましたよ。
kyon9haruhi1

2017/03/03 07:48

DB登録時にエラーが出ているようなので、現状yyyy/MM/ddで登録されているカラムにyyyy/MM/dd hh:mm:ssを登録しようとしているのが悪いのではないかと考えていました。 先に回答いただいた方のお話ではDB登録時に勝手に時間以降が削除されて登録されるはずと言っていたので試しているのですがうまくいかない状況です。
退会済みユーザー

退会済みユーザー

2017/03/03 08:13

>DB登録時に勝手に時間以降が削除されて 上記が不可能かどうかはここではコメントできませんが、もしできないとしたらyyyy/MM/dd hh:mm:ssのyyyy/MM/ddだけ抜き出してsqlへ出力すればいいのではと思います。
kyon9haruhi1

2017/03/03 12:08

上記対応で行けました! 時間以降は自動で削除?伏せられて登録されていました。 ありがとうございます。
guest

0

対象項目の型はDATE型なんですよね?
SQL自体でYYYY/MM/DD形式の文字列をTO_DATE()関数でDATE型に変換してINSERTしてしまっては?

SQL

1SQL> desc TARGET_TABLE 2 名前 NULL? 型 3 ----------------------------------------- -------- ---------------------------- 4 ID NOT NULL CHAR(5) 5 INS_DATE NOT NULL DATE 6 7SQL> INSERT INTO TARGET_TABLE (ID, INS_DATE) values ('01234', TO_DATE('2017/01/01', 'YYYY/MM/DD'));

投稿2017/03/03 08:16

Y.H.

総合スコア7914

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問