ORACLE TECHNOLOGY NETWORK
 
 
   

Oracle Technology Network (OTN) Japan - 掲示板 » データベース(R/O) » Oracle Database 10gの部屋(読取専用)

スレッド: TO_DATE(sysdate,'YYYY/MM/DD')としたときの動き

このスレッドに返信する このスレッドに返信する スレッド一覧へ スレッド一覧へ

Permlink 返信数: 4 - ページ数: 1 - 最新投稿 : 2007/10/19 18:45 最新投稿者: hh - スレッド表示形式:
hh

投稿数: 33
登録日時: 03/06/23


TO_DATE(sysdate,'YYYY/MM/DD')としたときの動き
投稿時刻: 2007/10/19 17:36
  このスレッドに返信します… 返信

sysdateから日付の部分だけをとりたい場合、
TO_CHAR(sysdate,'YYYY/MM/DD')とすれば取れますが、
これを誤って
TO_DATE(sysdate,'YYYY/MM/DD')として、
そしてそれ結果をINSERTで日付型のカラムに入れたら、
’2007'としたかった年の部分が'0007'となってしまいました。

本来なら
TO_DATE(TO_CHAR(sysdate,'YYYY/MM/DD'))とすればいいのは分かるのですが、
なぜ上記のような結果になるのでしょうか。
NLS_DATE_FORMATが'RR-MM-DD'となっていることが関係があるのは分かるのですが、
うまく流れが説明できません。
どういうことになっているのでしょうか。

茶太郎

投稿数: 11,815
登録日時: 99/03/15


Re: TO_DATE(sysdate,'YYYY/MM/DD')としたときの動き
投稿時刻: 2007/10/19 17:40   hh さんへの返信です。 hh さんへの返信です。
  このスレッドに返信します… 返信

> 本来なら
> TO_DATE(TO_CHAR(sysdate,'YYYY/MM/DD'))とすればいいのは分かるのですが、

いいえ、時間部分が不要でしたらtrunc(sysdate)ではないかと。

> なぜ上記のような結果になるのでしょうか。
> NLS_DATE_FORMATが'RR-MM-DD'となっていることが関係があるのは分かるのですが、
> うまく流れが説明できません。

TO_CHAR(TO_DATE(sysdate,'YYYY/MM/DD'),'YYYY/MM/DD')を
確認すればわかるのでは。

hh

投稿数: 33
登録日時: 03/06/23


Re: TO_DATE(sysdate,'YYYY/MM/DD')としたときの動き
投稿時刻: 2007/10/19 18:13   茶太郎 さんへの返信です。 茶太郎 さんへの返信です。
  このスレッドに返信します… 返信

回答ありがとうございます。

TRUNCというものがあるのですね、知りませんでした。
これを使うべきですね。


>TO_CHAR(TO_DATE(sysdate,'YYYY/MM/DD'),'YYYY/MM/DD')を
>確認すればわかるのでは。

これを実行すると、'0007/10/19'という形で返ってきました。
そこでsysdate部分を文字にして、
TO_CHAR(TO_DATE('07-10-19','YYYY/MM/DD'),'YYYY/MM/DD')としたら
やはり'0007/10/19'という形で返ってきました。

そこで思ったのですが、
本来、TO_DATEの最初の引数は文字列であるべきなので、
sysdateが内部的に文字列に変換されているのではないでしょうか。
NLS_DATE_FORMATにしたがって'07-10-19'という形式に。
でこれをTO_DATEでもう一度DATE型にしようとするのですが、
フォーマットとして'YYYY/MM/DD'が指定されているので、
無理やり年号部分を4桁と解釈しようとした結果、'0007'になってしまう。
ということなのかなと思うのですが・・・。
実際、TO_DATEのフォーマットを'YY/MM/DD'にしてやれば、'2007'になりましたので。

うぇいく

投稿数: 5,722
登録日時: 99/12/20


Re: TO_DATE(sysdate,'YYYY/MM/DD')としたときの動き
投稿時刻: 2007/10/19 18:35   hh さんへの返信です。 hh さんへの返信です。
  このスレッドに返信します… 返信

 こんにちは。
>>回答ありがとうございます。

>TRUNCというものがあるのですね、知りませんでした。
>これを使うべきですね。


>>TO_CHAR(TO_DATE(sysdate,'YYYY/MM/DD'),'YYYY/MM/DD')を
>>確認すればわかるのでは。

>これを実行すると、'0007/10/19'という形で返ってきました。
>そこでsysdate部分を文字にして、
>TO_CHAR(TO_DATE('07-10-19','YYYY/MM/DD'),'YYYY/MM/DD')としたら
>やはり'0007/10/19'という形で返ってきました。

>そこで思ったのですが、
>本来、TO_DATEの最初の引数は文字列であるべきなので、
>sysdateが内部的に文字列に変換されているのではないでしょうか。
それを確認するのは、マニュアルです。

見るとわかりますが、第1引数は、文字列だけではなく、数値も
受け付けます。

# TRUNCもマニュアルに出ています。関数については比較的まとまって
# 記載されていますので、ぜひ、全て目を通してください。全て覚える
# のではなく、「そーいえば、そんなようなのがあったような気が?」と
# というレベルでも、目を通したかどうかで、雲泥の差があります。
## TRUNCも引数の型によっていろいろと動作があります。
-- CMN v0.50eβ うぇいく --

hh

投稿数: 33
登録日時: 03/06/23


Re: TO_DATE(sysdate,'YYYY/MM/DD')としたときの動き
投稿時刻: 2007/10/19 18:45   うぇいく さんへの返信です。 うぇいく さんへの返信です。
  このスレッドに返信します… 返信

回答ありがとうございます。

質問する前にマニュアルを見るべきでしたね。
すみませんでした。

>見るとわかりますが、第1引数は、文字列だけではなく、数値も受け付けます

なるほど、そうなんですね。
勉強になります。


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






ウェブサイトのご使用条件 | 個人情報保護基本方針/情報保護基本方針