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

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

ただいまの
回答率

91.01%

  • Oracle

    518questions

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

DATE型のデータをTO_CHARで文字型に変換する際に、年月日が逆転してしまう。

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 423

ogura87

score 81

DATE型のデータをTO_CHARで日付に変換すると、日付が逆転してしまうという現象に見舞われました。

HOGE DATE:
HAGE CHAR;

HOGE := '2017/09/01 00:00:00';
HAGE := TO_CHAR(HOGE,'YYYY/MM/DD HH24:MI:SS)

と、このように、日付を文字に変換すると、HAGEに入る値は、

'0001/09/17 00:00:00'

となってしまうのです。

HAGE := TO_CHAR(HOGE,'DD/MM/YYYY HH24:MI:SS)

とすると、

'2017/09/01 00:00:00'

と、きちんと入ります。

このような現象になってしまうのですが、理由が全くわからなくて困惑しています。
同じような現象が起こった方はいらっしゃいまあうでしょうか?

何かしらヒントとなるような事でもいいので、ご助言を頂けましたら幸甚です。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+2

HOGEに日付書式の文字列で代入してるからじゃないですかね。

HOGE := TO_DATE('2017/09/01 00:00:00', 'YYYY/MM/DD HH24:MI:SS');
HAGE := TO_CHAR(HOGE,'YYYY/MM/DD HH24:MI:SS');


としたら、どうなります?

※HAGEはダメでしょ(笑)

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/09/16 13:48

    sazi様

    そのあたりは何度も試したのですが、
    結果としましては、

    '0001/09/17 00:00:00'となりました。

    キャンセル

  • 2017/09/16 19:51

    では、
    select sysdate from dual
    とすると、どのように表示されますか。
    そもそもですが、HAGEの内容の確認はどのようにされていますか。
    HAGE := TO_CHAR(HOGE,'DD/MM/YYYY HH24:MI:SS)
    で、文字列として代入しているのに書式が変わるのは見たことがありません。

    キャンセル

  • 2017/09/20 08:08

    sazi様
    select sysdate from dual
    の結果は、'2017-09-19'になります。

    キャンセル

  • 2017/09/20 08:11

    HAGEの確認は、SQL Developerで、DBMS_OUTPUT.LINEを使っています。

    キャンセル

  • 2017/09/20 10:00 編集

    断片的な情報ではこれ以上は難しそうです。
    SQL Developerであればデバッグできますよね。
    変数の中身はどうなっているのか確認していますか?
    それでも解決しないなら、全体的に具体的なコードおよび実行環境を提示して貰えますか。

    キャンセル

  • 2017/10/07 11:53

    sazi様

    いろいろとありがとうございます。
    結論から申し上げますと、解決できました。

    解決方法は、DATE型の引数の値をそのままTI_CHAR(HOGE,'YYYY/MM/DD')と渡すとYYとDDが逆転してしまっていたのですが、引数でわたってきたHOGEを一旦、一旦VAERVHAR2型の変数にTO_CHRA(HOGE.'YYYY/MM/DD')に格納して、それを引数で渡せば逆転しなくなりました。
    (何言っているのかわかなければすいません。私もなぜこんな事で逆転しなくなったのか理由が説明できません。)

    パッケージソフトを使っているので、パッケージソフトのバグかもしれません。

    キャンセル

+1

質問とちょっとずれるけど、

暗黙の型変換に頼るとパフォーマンスの低下や誤動作の恐れがあります。
十分なデータ量がない開発環境では問題がなくても何千万件、何億件もデータがあるかもしれない本番環境では暗黙の型変換によるTABLE ACCESS FULLが多発したらたまりません。

データが多くなったら直せば良いって人がいますが、その時バグ対応としてあなたは無償でプログラムを直せますか?それとも他の人が直したとして、その費用をあなたが払えますか? て諭さないといけない場面が何度もあります。

わたしはOracle Client が使える時は{$ORACLE_HOME]/sqlplus/admin/glogin.sql の最後に
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY/MM/DD HH24:MI:SS' ;
ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'YYYY/MM/DD HH24:MI:SSXFF' ;
ALTER SESSION SET NLS_TIMESTAMP_TZ_FORMAT = 'YYYY/MM/DD HH24:MI:SSXFF TZR' ;
を追加しています。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/09/16 13:46

    Orlofsky様

    なるほど。。。
    勉強になります。

    ありがとうございました。

    キャンセル

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

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

関連した質問

  • 解決済

    Oracleの外部結合について

    こちらのSQLで test_tb1のカラムa.idとnameで紐づくb.hogeのカラム がまとめて出力されるかと思います。 select a.id, b.hog

  • 解決済

    SQLの日付指定検索

    SQLで日付(DATE型)カラムを条件検索しようとしており、抽出条件は現在月の特定日(例えばX月15日)で検索したいのですが、どのように記述すればよいでしょうか? 条件の比較

  • 解決済

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

    前提・実現したいこと C#でバッチプログラムを作成しています。 SQLでUPDATE文を書いているのですが、DBに登録されている日付型がyyyy/MM/dd形式で、プログラム中

  • 解決済

    サブクエリを用いてユーザー数の累積合計を求めたい

    前提・実現したいこと MySQLユーザー数の累積合計を求めたいです。 発生している問題・エラーメッセージ Table 'database_name.e' doesn't 

  • 解決済

    Dateオブジェクトはシリアライザブルですか?

    文字列や配列、オブジェクト、booleanはシリアライザブルである認識なのですが、Dateオブジェクトのインスタンスはシリアライザブルでしょうか?

  • 解決済

    Excel VBA ヘッダーの設定

    Excel VBAでヘッダーの設定をしていますが、想定外の結果になります。 中央ヘッダー:シート名・フォントArial・サイズ10pt 右ヘッダー:日付を「mm/dd/yyyy」で

  • 解決済

    日付に日数を加算して yyyy-mm-dd で表示したい。

    閲覧ありがとうございます。 日付の扱い方について、 hoge = 2017-09-20 という日付の変数に2日を加算して hoge = 2017-09-23 という形に

  • 解決済

    Swift4で文字列からDate型へのキャスト

    Swift4でiOSアプリの開発をしています。 "yyyy-MM-dd'T'HH:mm:ssZZZZZ" の形式の文字列の日付情報を、 "yyyy年MM月dd日" の形式に変換

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

  • Oracle

    518questions

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