之前说过MySQL的时间字段有date,time,datetime,timestamp等,在实际查询时间段时,我们经常将整个字段存储进去,例如像2011-03-10 00:00:00,也有分开存储年,月,日的方式,或者使用right()等字符截取函数来进行查询操作。Anyway,我们都是要对一段时间进行查询。笔者最近在做游戏道具购买方面的查询,按照需要,我们要按照周的方式,查询一周的道具销售量。使用的方式为下面的这种:
select count(*) from table where buytime>='2011-5-31 00:00:00' and buytime<='2011-6-6 23:59:59' group by itemname
这是一种比较传统的方式,需要我们自己指定开始和结束时间,经常使用>,between,<,=来做时间段的规划,但是我们发下这里的buytime不是整型数据,效率比较低,尤其是数据达到百万级之后速度明显会降下来。所以我们采取第二种方法来解决:
Unix时间戳
每个时间都对应了一个唯一的Unix时间戳,时间从1970-1-1 00:00:00开始计时,每过一秒,就加1,在MySQl中有传统时间函数和Unix时间戳的互换函数。Unix_Timestamp(datetime) 和From_Unixtime(unixtime)
mysql> select unix_timestamp('2011-8-2 8:50:34');
+------------------------------------+
| unix_timestamp('2011-8-2 8:50:34') |
+------------------------------------+
| 1312246234 |
+------------------------------------+
1 row in set (0.03 sec)mysql> select from_unixtime(1312246234);
+---------------------------+
| from_unixtime(1312246234) |
+---------------------------+
| 2011-08-02 08:50:34 |
+---------------------------+
1 row in set (0.00 sec)
如此一拉,我们把原来的时间字段,替换成现在unix的整型字段,通过对整数比较,可以大大提高效率,查询时,我们把开始结束时间转换成unix时间戳。
select count(*) from table where buytime>=unix_stamp('2011-5-31 00:00:00') and buytime<=unix_stamp('2011-6-6 23:59:59') group by itemname.
不过这种方式,比较麻烦的就是查询之后需要将时间翻转一次。