- ベストアンサー
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型のデータの時刻を取る方法をご存知でしたら、教えていただけますでしょうか。 よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
試してないので憶測ですが、 おそらくdtWorkEndDate は時間ももってます。 日付のデフォルト出力フォーマットが[yy-mm-dd]になってるので、時間が表示されないだけです。 to_char(to_date(charWorkEndDate, 'YYYY/MM/DD HH24:MI:SS'), 'YYYY/MM/DD HH24:MI:SS'); とすれば、時間も表示されませんか?
その他の回答 (2)
- Kuppycat
- ベストアンサー率50% (109/216)
INSERT INTO テーブル名 VALUES(dtWorkEndDate) だけで。 前後にシングルコーテーションを付加すると、 '''||TO_CHAR(dtWorkEndDate)||''' と同じことになってしまうはずなので。
お礼
回答ありがとうございます。 シングルクォーテーションを付けないと、 number型と見なされエラーとなってしまいました。。
- shobon
- ベストアンサー率66% (14/21)
実際にDate型に[05-12-25]の値が入っているわけではなく、単に表示する時に時刻を削って表示しているだけだと思われます。 そのままdtWorkEndDateをINSERTして、 SELECT TO_CHAR([dtWorkEndDateを入れたテーブル列名,'YYYY/MM/DD HH24:MI:SS') FROM [dtWorkEndDateを入れたテーブル行名] ; としてみてください。 DBに値がちゃんと入っているのが確認できると思われます。
お礼
回答ありがとうございます。 そのままdtWorkEndDateをINSERTしたのですが、 DBには日付しか入りませんでした。 >単に表示する時に時刻を削って表示しているだけだと思われます。 INSERTの前の時点では、 TO_CHAR(dtWorkEndDate, 'YYYY/MM/DD HH24:MI:SS') で表示させたところ、時間が入っていました。 INSERT文は execute immediate 'INSERT INTO テーブル名 VALUES(''' || dtWorkEndDate || ''')'; となっています。 INSERT文のログは、VALUES('05-01-04')となっていました。 もし何かお気づきの点がありましたらご教授下さい。 よろしくお願いします。
お礼
返信ありがとうございます。 >to_char(to_date(charWorkEndDate, 'YYYY/MM/DD HH24:MI:SS'), 'YYYY/MM/DD HH24:MI:SS'); で時間も取得できました。 重ねてもしご存知でしたら教えていただきたいのですが、 この取得した日時をDATE型でINSERTしたい場合は、 どのような記述が適切なのでしょうか。 TO_DATEでは日時が落ちてしまい、 'to_char(to_date(charWorkEndDate, 'YYYY/MM/DD HH24:MI:SS'), 'YYYY/MM/DD HH24:MI:SS')' ではリテラルと書式が一致しないとエラーになってしまいます。 初期化パラメータNLS_DATE_FORMATを変更するしかないのでしょうか。