• ベストアンサー

【PL/SQL】DATE型の時刻の表示と非表示

PL/SQLでのDATE型の取扱いについて教えてください。 初期化パラメータNLS_DATE_FORMATが'YY-MM-DD'で、 ある列を'YYYY/MM/DD HH24:MI:SS'形式でDBにINSERTしたい場合、 dtWorkEndDate := to_date(charWorkEndDate, 'YYYY/MM/DD HH24:MI:SS'); としてINSERTにdtWorkEndDateを用いると、 YY-MM-DD形式でDBに登録されてしまいます。 (dtWorkEndDateはDATE型。) ORACLEの設定かPL/SQLの問題なのかわからないのですが、 なにかアドバイスを頂けないでしょうか。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.2

q=2142210 No.3でも指摘されてますが、 execute immediate文を使ってるのが、悪さしてるのでは。 dtWorkEndDate := to_date(charWorkEndDate, 'YYYY/MM/DD HH24:MI:SS'); INSERT INTO テーブル名 VALUES ( dtWorkEndDate ); ――みたいに、単純な書き方で済むはずですが。

sum853
質問者

お礼

回答ありがとうございます。 execute文等に不備は無く、データ確認の際のこちらの知識不足でした。 ありがとうございました。

sum853
質問者

補足

やはりexecute immediateの中でシングルクォートを 用いていたのが良くなかったようです。 INSERT INTO テーブル名 VALUES to_date(charWorkEndDate, 'YYYY/MM/DD HH24:MI:SS') とし、to_dateを文字列で渡してやることにより 問題解決致しました。 ありがとうございました。

その他の回答 (1)

  • proust
  • ベストアンサー率57% (62/108)
回答No.1

DBにどんな形式で日付が格納されているかを どのように確認していますか? 例えば CREATE TABLE worktable (end_date date); というテーブルなら SQL*Plusで SQL> SELECT * from worktable; としただけではNLS_DATE_FORMATが効いてしまうので SQL> SELECT to_char(end_date, 'yyyy/mm/dd hh24:mi:ss') from worktable; とするか SQL> alter session set nls_date_format='yyyy/mm/dd hh24:mi:ss'); SQL> SELECT end_date from worktable; とする必要がありますね。

sum853
質問者

お礼

回答ありがとうございます。 今まではデータをSI Object Browserで確認していたのですが、 OracleのEnterprise Managerで確認したところ、 時刻もINSERTされていました。 データ確認の際にNLS_DATE_FORMATが影響することに 気付きませんでした。 ありがとうございました。

関連するQ&A

  • PL/SQLでのTO_DATEの時間取得について

    お世話になります。 PL/SQLでDATE型のデータの日時を取得する方法を教えてください。 PL/SQLでDBの値を、TO_CHARで取ってきて、その値をTO_DATEすると、時刻が落ちてしまいます。 charWorkEndDate VARCHAR2(20); dtWorkEndDate DATE; charWorkEndDate := to_char(V00061_Rec.S_DATE5, 'YYYY/MM/DD HH24:MI:SS'); dtWorkEndDate := to_date(charWorkEndDate, 'YYYY/MM/DD HH24:MI:SS'); 出力結果 --charWorkEndDate- [2005/12/25 06:00:19] --dtWorkEndDate- [05-12-25] to_dateの1つ目の引数にシングルクォーテーションが必要かと思い、 dtWorkEndDate := to_date('''||charWorkEndDate||''', 'YYYY/MM/DD HH24:MI:SS'); としてみたのですが、その場合、「ORA-01841: (周)年は-4713と+9999の間の0以外の数を指定する必要があります」とのエラーが出てしまいます。 どなたかDATE型のデータの時刻を取る方法をご存知でしたら、教えていただけますでしょうか。 よろしくお願いします。

  • 同じSQL文での検索結果が異なる

    visualbasic2005とoracleを使ってデータベース管理ソフトを作っています。 ひとつのデータのフィールドはいくつかあるのですが、 DATAUPLOADというフィールド値をSQL文で検索するときのみ、 土曜日のデータを拾おうとするとなぜか検索をかけるごとに 件数が1件ずつ減っていくという現象が起きています。 他のフィールドや土曜日以外のフィールドの検索の時には そのようなエラーは起こらないのですが、 同じSQL文で検索結果が随時異なってしまう場合には どのような原因が考えられますでしょうか? DATAUPLOAD は'2008/03/12 00:00:00'の形式のDate型データです。 あるDATE(日付)のデータを検索するときに使用しているSQL文は、 SELECT * FROM DATABASE WHERE DATEUPLOAD BETWEEN TO_DATE(' & CStr(Format(DATE, "yyyy/MM/dd")) & 00:00:00','yyyy/MM/dd hh24:mi:ss') AND TO_DATE(' CStr(Format(DATE, "yyyy/MM/dd")) & 23:59:59','yyyy/MM/dd hh24:mi:ss') です。 いろいろとSQL文を変更してみたのですが、 同じエラーが続いています。 何か思い当たることがありましたら 教えていただければと思います。

  • SQL*PLUSでの分秒までの表示の仕方

    お世話になっております。 Oracle SQL*PLUSでデータを打ち込んでいるところなのですが、 表示の仕方で分からないところがあるので、 どなたか教えていただけないでしょうか? date型で指定して日付カラムを作ったところに TO_DATE('2009-01-02 10:00:10','YYYY-MM-DD HH24:MI:SS'), と入力したのですが、select文でデータを検索したところ DATE -------- 09-01-02 と返ってきました。これを分、秒まで表示させるには どうしたらよいでしょうか?? よろしくお願いいたします。

  • date型へのinsertについて

    cプログラムにてoracleのあるテーブルのdate型カラムに値をinsertしたいのですが、 'YYYY/MM/DD hh:mm:ss'の情報を格納するにはどうすればよいのでしょうか? TO_DATEを使用するのでしょうか?

  • SQL*Loader  フォーマット変換について

    SQL*Loaderの制御ファイル内で、 以下のような日付データを変換するにはどうしたらよいでしょうか? ・2010-12-06 00:00:00.000 以前は'2010-12-06 00:00:00'の形式だったので "to_char(to_date(:DENPYO_DATE,'YYYY-MM-DD HH24:MI:SS'),'YYYYMMDD')" のようにして変換が可能だったのですが、仕様変更がありましてこれに対応しなければいけなくなりました。 ちなみに安易な考えで以下のようにしたのですがさすがにだめでした... "to_char(to_date(:DENPYO_DATE,'YYYY-MM-DD HH24:MI:SS.000'),'YYYYMMDD')" 方法をご存知の方がいれば是非、ご教示いただきたく存じます。 よろしくお願いいたします。

  • oracleのDate型

    Ceate table test( field1 date ) insert into test values(current_timestamp); 上記の処理でDate型の列にcurrent_timestampデータを入れても、年月日までしかはいらないのですが、yyyy/mm/dd hh24:mi:ssの形で はできないのでしょうか?oracleは10gです。

  • 日付をVARCHAR2型でYYYYMMDDと表示したい

    DATE型(YYYY/MM/DD HH24:MI:SS)の値を取り出し、 VARCHAR2(8)型の文字列YYYYMMDDにしたいと思っています。 TO_CHAR(DATE型,'YYYYMMDD')としても、YY-MM-DDと表示されてしまいます。 YYYYMMDDと文字型で表示させるにはどうすればよいのでしょうか。 宜しくお願い致します。

  • to_timestampを使ったアップデート

    オラクル初心者です。 「to_timestamp」を使用したデータベースへの書き込みのSQL文が分かりません。 ツールは「つみきWEB」を使用しています。 フィールドの形式は to_timestamp(yyyy/mm/dd hh24:mi:ss.ff3)です。 行ったコマンドは以下に示します。 update (テーブル名) set (書き込みを行うフィールド) = to_timestamp('11/11 11:11:11' 、'yyyy/mm/dd hh24:mi:ss.ff3') WHERE (条件)

  • Oracleのselect文で日時表示する簡単な方法ないですか?

    SQL Plusで、select * from table とするとdata型はyyyy/mm/ddで表示されます。 いちいちto_char(time_stamp,’yyyy/mm/dd hh24:mi:ss’)とするのは苦痛なので、デフォルトで時間まで表示させる設定方法があったら教えてください。 # 私は、時々手作業でデータを集めている素人です。 # いままではSQL Serverだけだったのが、Oracleが増えて # 作法が異なるので戸惑ってます。

  • MySQLのTimestamp(14)型のフィールドにYYYY/MM/DD hh:mm形式のデータをインサートするには

    MySQLのTimestamp(14)型のフィールドに YYYY/MM/DD hh:mm形式のデータをインサートするには どのようにしたらよいのでしょうか? MySQL の Timestamp(14)型(YYYY-MM-DD hh:mm:ss)のフィールドに YYYY/MM/DD hh:mm 形式のデータ(ssに該当するデータがない)を インサートするには、 PHPでどのようにしたらよいのでしょうか? できれば、インサートの際にssに自動的に00をつけたいです。 現在、PHPでinsert文を実行すると、データの桁数が足りないため、 フィールドの値は、0000-00-00 00:00:00になってしまいます。 同じ形式(YYYY/MM/DD hh:mm)のデータをphpMyAdminで インポートすると、自動的にssに00がつき、 YYYY-MM-DD hh:mm:ss(例 2009-10-20 12:10:00) となってくれます。 PHPでもphpMyAdminと同じ処理をしたいのですが、 インターネットで検索してもやり方が見つからず、 どのようにしたらよいのか、わかりません。。。 インサートするデータサイズが83MBと大きいので、 PHPで処理したいと思っています。 (phpMyAdminは8MBまでなので) ご存知の方がいましたら、教えていただけると、 助かります。m(_ _)m レンタルサーバー:さくら インサートするファイル:CSVファイル PHP 5.2.x MySQL 5.1 phpMyAdmin 3.1.3.1

    • ベストアンサー
    • MySQL

専門家に質問してみよう