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

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

ただいまの
回答率

90.01%

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,749

kyon9haruhi1

score 5

前提・実現したいこと

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#です。
下記ソースの前にパラメータを宣言しています。

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


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

試したこと

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

宜しくお願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+2

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/03 15:50 編集

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

    キャンセル

  • 2017/03/03 16:15

    課題管理票に質問事項記載して待ちます。

    単純にyyyy/MM/dd形式に変換して登録することはできないのでしょうか?

    キャンセル

  • 2017/03/03 17:36

    設定次第です。

    キャンセル

checkベストアンサー

+1

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

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

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


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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/03 16:48

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

    キャンセル

  • 2017/03/03 17:13

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

    キャンセル

  • 2017/03/03 21:08

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

    キャンセル

0

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

SQL> desc TARGET_TABLE
 名前                                      NULL?    型
 ----------------------------------------- -------- ----------------------------
 ID                                      NOT NULL CHAR(5)
 INS_DATE                                NOT NULL DATE

SQL> INSERT INTO TARGET_TABLE (ID, INS_DATE) values ('01234', TO_DATE('2017/01/01', 'YYYY/MM/DD'));

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.01%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る