MySQLでテーブルの更新日時のカラムをTIMESTAMP型からINT型(unixtime)に変更しようかと思っています。思い付いたメリットなどを下記に列挙しましたが、それ以外に何かありましたらアドバイスをお願いします。


変更するメリットとして、

・プログラム内で処理しやすい
・TIMESTAMPが「2011-05-28 12:21:47」だと、INTでは「1306552907」となりコンパクト。単純に考えてPHPなどのアプリケーションから問合わせ時の通信トラフィックを抑えられそう

デメリットとして、

・TIMESTAMPのCURRENT_TIMESTAMPが使えないので、更新時にプログラム側で対処の必要
・UNIXTIMEだと日時が直感的に分かりにくい

などなど。

ちなみに、以下のサイトは参考にしました。
http://blog.fukaoi.org/2009/03/19/mysql_datetime
http://d.hatena.ne.jp/ono_matope/20100430

よろしくお願いします。

回答の条件
  • 1人2回まで
  • 13歳以上
  • 登録:2011/05/28 12:55:01
  • 終了:2011/06/04 12:55:03

回答(3件)

id:a-kuma3 No.1

a-kuma3回答回数4488ベストアンサー獲得回数18572011/05/28 13:42:45

ポイント27pt

TIMESTAMP で便利だとしたら、INSERT するときに値を指定しないと、現在時刻を設定してくれるところでしょうか。

ログを表すようなテーブルだと、処理が簡単になる可能性があります。


整数で扱う場合に便利なのは、「時刻が指定されて無い」という表現ができることです。

レコードを作るときには時刻が決まらなくて、後で決まる、というような場合には、

「時刻が指定されていない」というのを -1 を入れておく、というふうに作っておく、とか。


時刻に相当するデータを整数で保存する場合には、以下のパターンもあります。

  • 「2011-05-28 12:21:47」を「20110528122147」という整数で保存する

  • java で使われるような、通算のミリ秒で保存する


前者は、テーブルをダンプした場合でも、時刻の見当がつく、というメリットがあります。

そのかわり、時刻に見えないデータも簡単に保存できてしまう、というデメリットがあります。


後者は、秒よりも細かい精度が欲しい場合ですね。

それ以外は、time_t を格納するのと、同じです。

id:xxmasaxx

遅れましたが回答有り難うございます。

整数だと時刻以外を格納できるのも有りですね。参考にさせて頂きます。

2011/05/31 10:10:33
id:Banias No.2

Banias回答回数237ベストアンサー獲得回数192011/05/28 14:01:50

ポイント27pt

本論に入る前に、ご質問で提示されたメリット/デメリットについて検証しておきます。


【メリット】

・プログラム内で処理しやすい

これはプログラミング言語の性質にもよりますが、たいていの場合、TIMESTAMP型で取得したデータをintにキャスティングしてしまえば、以降はint型として処理できるので、たいしたメリットではないと考えます。

【メリット】

・TIMESTAMPが「2011-05-28 12:21:47」だと、INTでは「1306552907」となりコンパクト。単純に考えてPHPなどのアプリケーションから問合わせ時の通信トラフィックを抑えられそう

MySQL内部ではINTEGERもTIMESTAMPも32ビット長で格納していますので、トラフィックは変わりありません。


そのうえで、追加として考えられるメリット/デメリットを掲げます。

メリット デメリット
TIMESTAMP MySQL内でカレンダー計算が可能 1970~2037年の範囲でしか使えない
INT 他のデータ型や他のデータベースへの移行が楽 プログラム側にカレンダー計算ルーチンが必要

余談になりますが、私は、金融業務のような長期債務計算(35年ローンだと2037年を超えるため)が必要な場合には、LONGINTまたはDATETIMEを使い、西暦0年(架空の年号)からの累計秒数を計算しています。

また、国際取引が必要な場合には、RFC3339形式の日時情報をVARCHAR型で保持します。ローカル時間や季節時間を盛り込むことができるので、時差計算をするのに都合が良いのです。

さらに、考古学や天文学など、さらに幅広い年号を扱う場合は、ユリウス通日をDOUBLE型で実装しています。世界の旧暦を扱う計算式も用意されており、便利です。

id:xxmasaxx

確かにMySQL内部ではINTもTIMESTAMPも同じサイズですが、外部からSQLで問い合わせた際も同じ、とみてよいのでしょうか。

時差は想定してませんでしたが、VARCHARで保存する発想は面白いです。

遅れましたが回答どうも有り難うございました。

2011/05/31 10:17:31
id:chuken_kenkou No.3

chuken_kenkou回答回数722ベストアンサー獲得回数542011/05/28 14:02:14

ポイント26pt

MySQLのTIMESTAMP型は、MySQLにより自動更新するという独自機能を持つデータ型です。

ユーザ側で日時を保存するには、DATETIME型を使う必要があります。

SQL中で、日付演算を行うなら、DATETIME型、TIMESTAMP型を使わないと、いろいろ不便があるでしょう。

id:xxmasaxx

日付の計算は考えてませんでした。アプリケーション側で実装するにはちょっと面倒ですね。

遅れましたが回答どうも有り難うございました。

2011/05/31 10:19:32

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません