- ベストアンサー
【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の問題なのかわからないのですが、 なにかアドバイスを頂けないでしょうか。 よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
q=2142210 No.3でも指摘されてますが、 execute immediate文を使ってるのが、悪さしてるのでは。 dtWorkEndDate := to_date(charWorkEndDate, 'YYYY/MM/DD HH24:MI:SS'); INSERT INTO テーブル名 VALUES ( dtWorkEndDate ); ――みたいに、単純な書き方で済むはずですが。
その他の回答 (1)
- proust
- ベストアンサー率57% (62/108)
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; とする必要がありますね。
お礼
回答ありがとうございます。 今まではデータをSI Object Browserで確認していたのですが、 OracleのEnterprise Managerで確認したところ、 時刻もINSERTされていました。 データ確認の際にNLS_DATE_FORMATが影響することに 気付きませんでした。 ありがとうございました。
お礼
回答ありがとうございます。 execute文等に不備は無く、データ確認の際のこちらの知識不足でした。 ありがとうございました。
補足
やはりexecute immediateの中でシングルクォートを 用いていたのが良くなかったようです。 INSERT INTO テーブル名 VALUES to_date(charWorkEndDate, 'YYYY/MM/DD HH24:MI:SS') とし、to_dateを文字列で渡してやることにより 問題解決致しました。 ありがとうございました。