MySQL触りだして3年ぐらいたつんですがいまだに整理できないことが多いです。(特に日付がらみ)
ちょっとJavaのネタと合わせて整理しておこうかなーと思います。
Contents
MySQLの日付に関して
まずは型に関して日付は下記のようなものがあります。
date
YYYYーMMーDD型
日付に関して時分秒が取り扱えません。
time
HH:MM:SS型
いわゆる日付などの時間ではなく、経過時間などの型を知りたいときに有効
datetime
YYYYーMMーDD HH:MM:SS型
データ作成日、更新日などによく使われるデータの型
timestamp
YYYYーMMーDD HH:MM:SS型
datetimeと同様。
datetimeとtimestampの違い
- datetimeは日付の範囲が ‘1000-01-01 00:00:00’ から ‘9999-12-31 23:59:59’なのに対してtimestampは’1970-01-01 00:00:01’ から ‘2037-12-31 23:59:59’。
- バイト数がtimestampは4バイトに対してdatetimeは8バイト
他にもいろいろと違いはありますが、現状だとtimestampを使ったほうがメモリの省略になりそう。
参考リンク
DBOnlie 日付型と時刻型(DATE, TIME, DATETIME, TIMESTAMP, YEAR)
出力での整形
通常yyyyMMdd hhmmssなど日付型のデータで格納されているものを整形しyyyyMMなどで出力したり、検索条件などで使いたいとき。
下記のようにすれば表示できます。
1 |
SELECT DATE_FORMAT( sample_date , '%Y/%m/%d' ) FROM sample_table |
表記方法は下記リンクを参考に
DEFAULTの型
insertしたときのdefault値の決定ですが、CURRENT TIMESTAMPを指定してあげるとその時の時間がぴったり入ります。
が、これは1テーブルにつき1つのカラムにしか使えません。2つ以上に使用した場合、2つ目以降が自動的に”0000-00-00 00:00:00″になります。
その場合、MySQL側で普通にNOW()などと入れるしかありません。
ちなみにyyyyMMの日付を格納する場合どうしたらいいかを考えていましたがintにしてそのまま入れるという意見がありました。
確かに不細工ですが大小関係などがわかるのと日付の加算などはプログラム側で行えばよいということでしょう。
Javaでの日付処理
日付に関しては今まで標準のAPIを使っていましたが、joda-timeというライブラリが有名のようですね。
ここら辺は整理しておきたいところです。
pomでのインストール
1 2 3 4 5 |
<dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> <version>2.8.2</version> </dependency> |
まだ全然使えていないので折をみつけて使用法を確認しておきたいところです。