开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 2365|回复: 4
收起左侧

[Mysql] mysql时间相减的问题

[复制链接]

结帖率:61% (35/57)
发表于 2013-5-2 18:54:42 | 显示全部楼层 |阅读模式   海南省海口市
今天看到一条微博,提到mysql日期相减的错误结果,以前没有怎么注意,于是测试了一下,发现确实很坑爹,很容易踩雷,于是整理博客提醒一下大家。
  先看一下错误的现象如下,第1条正确,第2,3条的t2-t1不正确:
  [sql]
  mysql> select t1,t2,t2-t1 from mytest;
  +---------------------+---------------------+-------+
  | t1                  | t2                  | t2-t1 |
  +---------------------+---------------------+-------+
  | 2013-04-21 16:59:33 | 2013-04-21 16:59:43 |    10 |
  | 2013-04-21 16:59:33 | 2013-04-21 17:00:33 |  4100 |
  | 2013-04-21 16:59:33 | 2013-04-21 17:59:35 | 10002 |
  +---------------------+---------------------+-------+
  3 rows in set
  全部测试脚本如下:
  [sql]
  --创建表
  mysql> CREATE TABLE mytest (
  t1 datetime,
  t2 datetime
  );
  Query OK, 0 rows affected
  --插入测试记录
  mysql> insert into mytest(t1,t2) values('2013-04-21 16:59:33','2013-04-21 16:59:43');
  Query OK, 1 row affected
  mysql> insert into mytest(t1,t2) values('2013-04-21 16:59:33','2013-04-21 17:00:33');
  Query OK, 1 row affected
  mysql> insert into mytest(t1,t2) values('2013-04-21 16:59:33','2013-04-21 17:59:35');
  Query OK, 1 row affected
  --验证结果
  mysql> select t1,t2,t2-t1 from mytest;
  +---------------------+---------------------+-------+
  | t1                  | t2                  | t2-t1 |
  +---------------------+---------------------+-------+
  | 2013-04-21 16:59:33 | 2013-04-21 16:59:43 |    10 |
  | 2013-04-21 16:59:33 | 2013-04-21 17:00:33 |  4100 |
  | 2013-04-21 16:59:33 | 2013-04-21 17:59:35 | 10002 |
  +---------------------+---------------------+-------+
  3 rows in set
  实际是mysql的时间相减是做了一个隐式转换操作,将时间转换为整数,但并不是用unix_timestamp转换,而是直接把年月日时分秒 拼起来,如2013-04-21 16:59:33 直接转换为20130421165933,由于时间不是十进制,所以最后得到的结果没有意义,这也是导致上面出现坑爹的结果。
  [sql]
  mysql> select t1,
  t2,
  convert(t1, UNSIGNED INTEGER) ct1,
  convert(t2, UNSIGNED INTEGER) ct2,
  t2-t1,
  convert(t2, UNSIGNED INTEGER) -convert(t1, UNSIGNED INTEGER) diff0
  from mytest;
  +-------------------+-------------------+--------------+--------------+-----+-----+
  |t1                 |t2                 |ct1           |ct2           |t2-t1|diff0|
  +-------------------+-------------------+--------------+--------------+-----+-----+
  |2013-04-21 16:59:33|2013-04-21 16:59:43|20130421165933|20130421165943|   10|   10|
  |2013-04-21 16:59:33|2013-04-21 17:00:33|20130421165933|20130421170033| 4100| 4100|
  |2013-04-21 16:59:33|2013-04-21 17:59:35|20130421165933|20130421175935|10002|10002|
  +-------------------+-------------------+--------------+--------------+-----+-----+
  3 rows in set
  要得到正确的时间相减秒值,有以下3种方法:
  1、time_to_sec(timediff(t2, t1)),
  2、timestampdiff(second, t1, t2),
  3、unix_timestamp(t2) -unix_timestamp(t1)
  [sql]
  --测试脚本
  mysql> select t1,
  t2,
  t2-t1,
  time_to_sec(timediff(t2, t1)) diff1,
  timestampdiff(second, t1, t2) diff2,
  unix_timestamp(t2) -unix_timestamp(t1) diff3
  from mytest;
  +---------------------+---------------------+-------+-------+-------+-------+
  | t1                  | t2                  | t2-t1 | diff1 | diff2 | diff3 |
  +---------------------+---------------------+-------+-------+-------+-------+
  | 2013-04-21 16:59:33 | 2013-04-21 16:59:43 |    10 |    10 |    10 |    10 |
  | 2013-04-21 16:59:33 | 2013-04-21 17:00:33 |  4100 |    60 |    60 |    60 |
  | 2013-04-21 16:59:33 | 2013-04-21 17:59:35 | 10002 |  3602 |  3602 |  3602 |
  +---------------------+---------------------+-------+-------+-------+-------+
  3 rows in set
  这个问题2003年就有人在mysql4.0的版本时反馈,但mysql官方并不认为是bug,因为他们认为mysql并不支持时间直接相减操作,应该用专用函数处理,所以一直没有修正。但我认为这个很容易导致使用错误,要么就直接报错,要么显示正确的结果。
结帖率:100% (5/5)
发表于 2013-5-2 19:38:51 | 显示全部楼层   江苏省泰州市
太神熬了  直接没看懂
回复 支持 反对

使用道具 举报

结帖率:37% (7/19)
发表于 2013-5-10 11:16:14 | 显示全部楼层   北京市北京市
亦惜风流 发表于 2013-5-2 19:38
太神熬了  直接没看懂

我还有板凳
回复 支持 反对

使用道具 举报

签到天数: 3 天

发表于 2015-5-18 01:07:42 | 显示全部楼层   广东省东莞市
回复 支持 反对

使用道具 举报

结帖率:50% (1/2)
发表于 2015-5-21 20:53:29 | 显示全部楼层   辽宁省鞍山市
回复一下看看
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表