错误测试mysql时间相减的问题(bug)

系统 1718 0

在写这篇文章之前,xxx已经写过了几篇关于改错误测试主题的文章,想要了解的朋友可以去翻一下之前的文章

    

mysql时光相减的问题(bug)

    明天看到宁青同窗的一条 微博 ,提到mysql日期相减的错误结果,之前没有怎么意注,于是测试了一下,发明实确很坑爹,很易容踩雷,于是理整客博提示一下大家。
先看一下错误的景象如下,第1条确正,第2,3条的t2-t1不确正:

    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> 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,由于时光不是十进制,所以最后到得的结果没有意义,这也是致使下面现出坑爹的结果。

    每日一道理
成熟是一种明亮而不刺眼的光辉,一种圆润而不腻耳的音响,一种不需要对别人察颜观色的从容,一种终于停止了向周围申诉求告的大气,一种不理会哄闹的微笑,一种洗刷了偏激的淡漠,一种无须声张的厚实,一种其实不陡峭的高度。
    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)

    --测试本脚

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其实不支撑时光直接相减作操,应该用专用函数理处,所以直一没有修正。但我以为这个很易容致使用使错误,要么就直接报错,要么示显确正的结果。

    我的新浪微博 http://weibo.com/yzsind

文章结束给大家分享下程序员的一些笑话语录: 问:你觉得让你女朋友(或者任何一个女的)从你和李彦宏之间选一个,你觉得她会选谁?  
  答:因为李艳红这种败类,所以我没女友!

错误测试mysql时间相减的问题(bug)


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论