- PR -

MySQLのTimestampについて

1
投稿者投稿内容
sinh
ベテラン
会議室デビュー日: 2003/01/22
投稿数: 87
投稿日時: 2005-06-13 15:29
sinと申します。

現在
Windows XP Home SP1
Java 1.4.2_08
MySQL 4.0.24
connector-j mysql-connector-java-3.1.8-bin.jar
という環境でJDBCを利用してMySQLに接続し以下の処理を行っています。
1.Aテーブルからselect文でTimestamp型のデータを取得。
2.Bテーブルへのselect文のwhere句に1.で取得(getTimestamp)したデータを
setTimestampでセットして実行。

この処理で2.を実行する前にlog4jを使用し
log.debug(PreparedStatement)でsetTimestampした値を見ると
年が-1900され、月が-1された値が設定されてしまい困っています。

別の環境として、
White Box Enterprise Linux release 3.0
Java 1.4.2_06
MySQL 4.0.23a
connector-j mysql-connector-java-3.1.8-bin.jar
では正常にDBに設定された値が表示されます。

MySQLのバージョンの違いのためか、LinuxとWindowsの違いの
ためか、なぜ発生しているのかよくわからない状況です。

よろしくお願いいたします。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-06-13 16:09
接続先のDBのバージョンやJDBCドライバのバージョンを切り替えて切り分けしてみてはいかがでしょうか。
mone
常連さん
会議室デビュー日: 2005/05/18
投稿数: 37
投稿日時: 2005-06-13 16:14
こんにちは、moneです。

引用:

この処理で2.を実行する前にlog4jを使用し
log.debug(PreparedStatement)でsetTimestampした値を見ると
年が-1900され、月が-1された値が設定されてしまい困っています。


と、ありますが
2005年の場合は105年になってしまうのですか??

また、処理2を実行する際に
一致してほしいTimestampと一致しないということなのでしょうか?
それとも表示の際に正しい値にならなくて困っているということですか??
TimeStampの表示桁数はいくつになっているのでしょうか??

自分の読解力不足であったり、
的外れな質問だったら申し訳ありません。

[ メッセージ編集済み 編集者: mone 編集日時 2005-06-13 16:37 ]
sinh
ベテラン
会議室デビュー日: 2003/01/22
投稿数: 87
投稿日時: 2005-06-14 00:57
返信、ありがとうございます。

インギさん 引用---------------------------------------------------------
接続先のDBのバージョンやJDBCドライバのバージョンを切り替えて切り分けしてみてはいかがでしょうか。
--------------------------------------------------------------------------
やはり、それが一番原因を調べるには確実かもしれないですね。


moneさん 引用---------------------------------------------------------
2005年の場合は105年になってしまうのですか??

また、処理2を実行する際に
一致してほしいTimestampと一致しないということなのでしょうか?
それとも表示の際に正しい値にならなくて困っているということですか??
TimeStampの表示桁数はいくつになっているのでしょうか??
--------------------------------------------------------------------------
すいません、少し説明が不足してました。
指摘のとおり、2005年が105年となってしまいます。
処理2では、一致してほしいTimestampと一致しない状況となっています。
また、テーブルの作成時にTimestampの桁数の指定はしていないため
14桁となっています。


まだ、調査中ですが、インギさんのいわれているように
バージョンを変更して調べてみようと思います。
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2005-06-14 01:49
sinさん、こんにちは。

Timestampオブジェクトの表示や比較をどのように行ったか
にも依ると思いますが、
Timestampのスーパクラスである Dateの APIドキュメント
にある、
引用:
年、月、日、時間、分、秒の値を受け取るか返すクラス
Date のすべてのメソッドにおいて、次の表示が使用されます。
* 年 y は整数 y - 1900 によって表される
* 月は 0 〜 11 の整数で表される。0 は 1 月、1 は 2 月、
そして 11 は 12 月を意味する
 …


と書かれているのと関係あるのではないでしょうか?
mone
常連さん
会議室デビュー日: 2005/05/18
投稿数: 37
投稿日時: 2005-06-14 14:13
こんにちは、moneです。

引用:
Timestampのスーパクラスである Date・・・


あ、スーパークラスがDate型だったんですね、見落としていました。。。

と、言う事はJava側がTimestamp型で受け取った際に勝手に変換してしまっているためにうまくいかないということかな。

では、取得時に変換されないようにStringかなんかでうけとって
SQL側で日付に変換(ToDate)とかしてあげれば
うまくいきそうですね。
1

スキルアップ/キャリアアップ(JOB@IT)