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

mysql timediff 时间相减_mysql时间相减的问题相关推荐

  1. mysql 时间计算函数_MySQL时间计算函数DATE_SUB()用法简介说明

    摘要: 下文讲述MySQL数据库中时间计算函数DATE_SUB()的功能简介说明,如下所示: MySQL DATE_SUB 功能说明: MySQL DATE_SUB函数功能: 将一个时间值减去指定类型 ...

  2. mysql 两个日期加减_mysql日期加减运算

    MySQL 日期类型 MySQL 日期类型:日期格式.所占存储空间.日期范围 比较. 日期类型        存储空间       日期格式                 日期范围 -------- ...

  3. mysql 两个日期加减_mysql 日期加减

    mysql日期加减 一.MySQL 为日期增加一个时间间隔:date_add(). 1.  示例: set @dt = now(); select date_add(@dt, interval 1 d ...

  4. mysql时间格式函数_MySQL时间格式函数

    每周第一天: SELECT CURDATE(), DATE_ADD(CURDATE(),INTERVAL -WEEKDAY(CURDATE()) DAY); 每月第一天: SELECTCURDATE( ...

  5. mysql+时间查询函数_mysql时间查询函数实例

    会员表,有个birthday字段,值为'YYYY-MM-DD'格式,现在要查询一个时间段内过生日的会员,比如'06-03'到'07-08'这个时间段内所有过生日的会员. SQL语句: Select * ...

  6. mysql时间变成季度_Mysql 时间操作(当天, 昨天,7 天,30 天, 半年, 全年, 季度)

    1 . 查看当天日期 select current_date(); 2. 查看当天时间 select current_time(); 3.查看当天时间日期 select current_timesta ...

  7. mysql时间与字符_mysql时间与字符串之间相互转换

    1.时间转字符串 date_format(日期,格式字符串) select date_format(now(), '%y-%m-%d %h:%i:%s'); 2.字符串转时间 str_to_date( ...

  8. mysql时间取整_mysql时间处理

    函   数 功   能 CURDATE() 获取当前日期 CURTIME() 获取当前时间 NOW() 获取当前的日期和时间 UNIX_TIMESTAMP(date) 获取日期的UNIX时间戳 FRO ...

  9. mysql月份加减_MySQL 日期加减

    1. addtime() 为日期加上指定秒数 select addtime(now(),1); -- 加1秒 2. adddate() 有两种用法,第二个参数直接填数字的话是为日期加上指定天数,填in ...

最新文章

  1. Fragment 之间传递数据
  2. python内置模块大全 processon
  3. python2 中使用pip2 install package_name的时候报错:AttributeError: ‘int‘ object has no attribute ‘endswith‘
  4. 一个菜鸟程序员的游戏开发心得
  5. python server.py_python manage.py runserver报错
  6. 混合高斯模型_EM算法求解高斯混合模型(GMM)
  7. 文本内容之间的关键词提取和相似度计算
  8. 轩逸车联网功能怎么用_北斗已建设完成,那“北斗导航”怎么用?“短报文功能”怎么用?...
  9. sencha touch 入门学习资料大全
  10. html中加入数据库,HTML中如何连接数据库?
  11. 计算机模拟学,深度学习是让计算机模拟
  12. linux删除所有python进程,linux 下python进程查看及关闭
  13. 二建 机电工程常用材料及工程设备
  14. ubuntu-创建桌面快捷方式
  15. java判断闰年中闰月_2019年农历闰几月 关于闰年闰月的认识
  16. 预测大盘最准确的指标_迄今最权威的大盘预测K线指标下载
  17. ogg19.1.0.0.4打补丁
  18. Python 之 = [:] copy deepcopy
  19. html怎样导入ps,【Photoshop软件新手向】如何导入/自制笔刷?
  20. 约数倍数卡片 java_约数倍数选卡片

热门文章

  1. 看似复杂炫酷的数据可视化大屏,学会这个工具轻松搞定
  2. 微信小程序教程:注册微信小程序的操作步骤
  3. 【C语言】free函数如何知道要释放多大空间
  4. 有哪些家用的投影仪?什么牌子的投影仪便宜好用
  5. 8.2018年全网最全面的社群赚钱操作指南
  6. python3的pprint_Python3标准库:pprint美观打印数据结构
  7. 笔记本电脑无线网络出现红叉,服务中没有wlan autoconfig
  8. 论文阅读 [TPAMI-2022] Leveraging Instance-, Image- and Dataset-Level Information for Weakly Supervised I
  9. 10部高甜国产剧,《外星女生柴小七》上榜,错过一部都是遗憾
  10. 内网渗透之Linux反弹shell(一)