« 2007年05月30日 | メイン | 2007年06月01日 »

2007年05月31日

5月31日 やばいやばい

・データベース概論I

終わってる…。

・エージェントシステム

休講になった。

・ソフトウェア工学

デザインパターンの話が終わり、開発手法の話に入りました。配布資料は1部。

22:56 | コメント (0) | トラックバック | Class

XXXHOLiC シリーズ

久しぶりにマンガを一気読み。

XXXHOLiC 1
XXXHOLiC 2
XXXHOLiC 3
XXXHOLiC 4
XXXHOLiC 5
XXXHOLiC 6
XXXHOLiC 7
XXXHOLiC 8
XXXHOLiC 9
XXXHOLiC 10
XXXHOLiC 11

CLAMP 作品です。僕は神社っ子なので、主人公に親近感があります。嘘です。僕にはアヤカシが見えないので、特に親近感はありません…。でも面白いですね。最新刊を読んでいないので、機会があれば呼んでみたいと思います。

XXXHOLiC と xxxHOLiC が混在してる…。

【関連情報】
・xXXHOLiC - Wikipedia
 http://ja.wikipedia.org/wiki/XXXHOLiC

18:46 | コメント (2) | トラックバック | Memo

MySQL の DATETIME 型の日付の取り扱い

挿入日時を記録するために DATETIME 型を利用しているのですが、その日付の取り扱いに悩まされたので、書いてみる。

mysql> DESCRIBE hoge;
+-------+----------+------+-----+---------------------+-------+
| Field | Type     | Null | Key | Default             | Extra |
+-------+----------+------+-----+---------------------+-------+
| id    | int(11)  |      |     | 0                   |       |
| cdate | datetime |      |     | 0000-00-00 00:00:00 |       |
+-------+----------+------+-----+---------------------+-------+
2 rows in set (0.00 sec)

上記のようなテストテーブルを作成しました。挿入データは INT, DATETIME のみです。

mysql> SELECT * FROM hoge;
+----+---------------------+
| id | cdate               |
+----+---------------------+
|  0 | 2007-01-01 00:00:00 |
|  1 | 2007-01-01 00:00:05 |
+----+---------------------+
2 rows in set (0.00 sec)

挿入したデータは、上記の2種類。時刻を 0 で埋めたものを埋めていないものです。

日付値を前提とする関数は、通常、日付時刻値を受け入れて、時刻部分を無視します。

ドキュメントには、前記のように書いていたので、以下のようなクエリを投げてみます。

mysql> SELECT * FROM hoge WHERE cdate = '2007-01-01';
+----+---------------------+
| id | cdate               |
+----+---------------------+
|  0 | 2007-01-01 00:00:00 |
+----+---------------------+
1 row in set (0.00 sec)

ドキュメントから読み取った予想としては、日付で比較するのだから 2 rows の結果が欲しかったのです。すなわち、すでに挿入されてるデータの cdate が 2007-01-01 と解釈されて欲しかった。でもそうじゃない。

mysql> SELECT * FROM hoge WHERE cdate >= '2007-01-01';
+----+---------------------+
| id | cdate               |
+----+---------------------+
|  0 | 2007-01-01 00:00:00 |
|  1 | 2007-01-01 00:00:05 |
+----+---------------------+
2 rows in set (0.00 sec)

大なりイコールにすると 2 rows となるので、対象として与えた 2007-01-01 は、内部で 2007-01-01 00:00:00 と解釈されてる模様。

MySQL 4.1.20 を利用しているので、関数 DATE が利用できる。この関数は、まさに DATETIME 型を DATE 型に変換する関数です。

mysql> SELECT * FROM hoge WHERE DATE(cdate) = '2007-01-01';
+----+---------------------+
| id | cdate               |
+----+---------------------+
|  0 | 2007-01-01 00:00:00 |
|  1 | 2007-01-01 00:00:05 |
+----+---------------------+
2 rows in set (0.00 sec)

期待通りの結果に!

うだうだ書いたわけですが、僕のドキュメントの読み間違いが原因です。「日付時刻値を受け入れて、時刻部分を無視します」の後者を読んで勘違いしたわけです。前者もきちんと読めと…。

ドキュメント解釈ミスが起こりうるので、テストをきちんとしようと再確認した出来事でした。

【関連情報】
・6.3.4. 日付と時刻関数 - MySQL 4.1 リファレンスマニュアル
 http://dev.mysql.com/doc/refman/4.1/ja/date-and-time-functions.html

14:31 | コメント (4) | トラックバック | Technology

中だるみ継続中…

まずい。ということで、昨日(30日)の食事内容です。

ざるそば

昼は、蕎麦を食べたくなったので蕎麦を食べてきました。花畑にそば坊があるのですが、遠いのでセンターのアイアイモールにある一成で。ランチタイムなので安く食べれたのですが、食べ過ぎました…。ざるそばだけにしても良かったかな。

眠い一日でした。睡眠は足りてるはずなんだけど。歩きすぎかな。そういえば、初めて mixi 内で論争に参戦しました。図書館におけるマナーの悪さが云々。正直、筑波大学図書館のマナーが悪いと思わない(不快に思ったことが無い)のですが、面白そうだったので。

一成 (昼)
 小カツ丼, ざるそば

13:58 | コメント (0) | トラックバック | Meal