+ -
当前位置:首页 → 问答吧 → 我的时间字段变迁(可能会引起某些人的不满)

我的时间字段变迁(可能会引起某些人的不满)

时间:2009-12-30

来源:互联网

希望只是标题党,但以前在讨论中确实争执的比较厉害。我就说说自己的经历,大家就承让一下吧。

【早期】
99年用mysql的时候主要使用int型,string型用得少主要是为兼容其他数据库。
时间戳用int型真是不错,date('Y-m-d',$time)可以很随意的输出各种格式的数据,输入也不错php的time(),mysql的now()即可。

【过渡期】
为了能让数据库自动更新时间,也用过timestamp型,但发现用两个以上的时间字段只自动更新一个似乎有问题,很短暂。

【中期】
几年时间过去了,int型用php处理确实不错,但问题来了:
1. 调试:插入/修改时间后检查对不对,只能使用from_unixtime转了以后和当前时间比较。
2. 维护:某大大要查某个人的操作记录,需要知道时间。好,登录数据,select * from tbl不行,select *,from_unixtime(time) from tbl不行,好吧,只能老老实实写全字段。
3. 查询:在表单上用户选择时间,查询start_date到end_date之间的数据,只能转换。具体函数忘了,每次用每次现查。
4. 统计:统计某个时间段的PV/UV等。好吧,还是转换,可数据量大的时候,还要等。那我建索引?在时间字段上用函数,没戏!
5. 输出:这点原先以为用date()很简单,可有些表想偷懒,反正内部使用就直接select * from tbl出来显示吧,时间字段还得处理。
6. 好处:记住了两个mysql函数,unix_timestamp和from_unixtime。还有就是大家都用int型。
不是很痛苦,但总觉得有点不顺,那就改改吧。从此开始用datetime类型。
1. 调试维护简单了
2. 查询简单了些log_date between '$start_date 00:00:00' and '$end_date 23:59:59'
3. 统计还得用函数,不过可以把datetime型当成字符串处理。
4. 输入简单了些。
5. datetime可以建索引,相当于两个int型。
对于只记录日期的也用date型。

【晚期】
晚期就是指现在,彻底统一了,不仅是log表
log_date    date型  NULL
log_time    time型  NULL
所有带日期时间的表都用
create_date    date型  NULL
create_time    time型  NULL
modify_date    date型  NULL
modify_time    time型  NULL
好处
1. 调试方便,直观
2. 维护方便,直观
3. 查询方便,log_date between ? and ?,或者log_date >= ?,或者 log_date like '2009-12-%'
4. 输出方便,日期直接输入log_date
5. 效率最高,所建的索引效率最高
6. 统计方便,select log_date,count(*),count(distinct mobile) from tbl group by log_date
7. 其他好处:丰富的mysql时间处理函数;可做时段统计;虽然开发时可能不要求统计功能,但能随时应付突然其来的统计需求。
不好的地方就是,当接手别人的数据库,看见int时间戳,只能皱皱眉头多花点时间处理。

好吧,我只能说我被date/time类型征服了。

作者: 602000   发布时间: 2009-12-30

10年老鸟~·膜拜一下

作者: evilhandsome   发布时间: 2009-12-30

我好像一直都用date或者是datetime类型的...

作者: 林轻灵   发布时间: 2009-12-30

我用int 存放长时间戳。

作者: mwb525   发布时间: 2009-12-30

本帖最后由 blvming 于 2009-12-31 10:36 编辑

使用int 做时间时段,我觉得主要是为了效率。相对 date或datetime等,int在条件索引上是比 date等快的。毕竟是整型数据,底层排序也快!对此,大家可以做一个测试。使用int和date做where条件。
这里引用别人做的一个测试:
http://www.54chen.com/_linux_/%E5%8E%9F%E5%88%9B%E5%AE%9E%E6%B5%8Bmysql%E6%97%B6%E9%97%B4%E5%AD%97%E6%AE%B5%E7%A9%B6%E7%AB%9F%E4%BD%BF%E7%94%A8int%E8%BF%98%E6%98%AFdatetime%EF%BC%9F.html

作者: blvming   发布时间: 2009-12-31

int 索引占1个整型
datetime 索引占2个整型
date 索引占1个整型
time 索引占1个整型
拿int型和datetime去比较没有意义。而且我已经放弃datetime,用双字段date+time去存储时间

对于查询某个日期的sql语句来说
int 索引使用range
date索引可使用const
explain可以看到,你说哪个快呢?

当然对于查询精确到某天某时,那肯定还是int快。

作者: 602000   发布时间: 2009-12-31

来顶大Z

一直在用INT型

作者: adbbaby   发布时间: 2009-12-31